csu 1548: Design road (三分)

题意:需要从(0,0) 点 到(x,y) 修一段路

         其中有n条和y轴平行的河

         修路的单位成本c1 修桥的单位成本c2

         问最小总成本为多少

思路:把所有河合并

         再三分桥的长度

         求出最小成本

 

#include<cstdio>

#include<iostream>

#include<cstring>

#include<cmath>

#include<stdlib.h>

#include<algorithm>

#include<queue>

#include<stack>

#include<ctype.h>

using namespace std;

const int MAXN=100+5;

int vis[10000+100];

int a[MAXN];

int cmp(int a,int b)

{

    return a>b;

}

int max(int a,int b)

{

    if(a>b) return a;

    else return b;

}

int main()

{

    int kase;

    scanf("%d",&kase);

    while(kase--)

    {

        int n,ans=0,cnt=0,res=0,maxn=0,minn,numa=0,numb=0,sum=0;

        scanf("%d",&n);

        for(int i=0;i<n;i++)

        {

            int op,num;

            scanf("%d %d",&op,&num);

            if(op==2) ans+=num;

            if(op==1) {a[cnt++]=num;sum+=num;}

        }

        if(cnt>0)

        {

           memset(vis,0,sizeof(vis));

           vis[0]=1;

           for(int i=0;i<cnt;i++)

           {

               for(int j=10000;j>=a[i];j--)

               {

                   if(vis[j-a[i]]==1) vis[j]=1;

               }

           }

           int hsum=(sum+1)/2;

           int l=hsum;//r=hsum;

           while(vis[l]==0)

           {

               l--;

           }

           maxn=max(l,sum-l);

        }

        res=ans+maxn;

        printf("%d\n",res);

    }

    return 0;

}

  

你可能感兴趣的:(design)