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; }