题意:需要从(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;
}