ZOJ 3090 Assemble(二分+贪心)
2013-04-29 22:30
363 查看
首先把所有的quality保存下来排序去重复.
然后二分quality,对于每一个quality 选择每一类部件的quality大于等于这个quality的价格最小的部件.
如果这个quality有部件不能达到这个quality或者有所有的最小价格的部件的总价大于预算就往左调quality(二分减小),否则可以往右调quality(二分增大).
然后二分quality,对于每一个quality 选择每一类部件的quality大于等于这个quality的价格最小的部件.
如果这个quality有部件不能达到这个quality或者有所有的最小价格的部件的总价大于预算就往左调quality(二分减小),否则可以往右调quality(二分增大).
#include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> #include <limits.h> using namespace std; const int maxn=1001; struct comp{ char name[30]; int qual,price; }cmps[maxn]; int qual[maxn],n,budget; char trash[30]; int main(){ int t; scanf("%d",&t); while (t--){ scanf("%d%d",&n,&budget); int qnum=0; for (int i=0;i<n;++i){ scanf("%s %s %d %d",cmps[i].name,trash,&cmps[i].price,&cmps[i].qual); qual[qnum++]=cmps[i].qual; } sort(qual,qual+qnum); qnum=unique(qual,qual+qnum)-qual; int low=0,high=qnum-1,ans=0; while (low<=high){ int mid=(low+high)>>1,i=0,j=0,q=qual[mid],sum=0; while (i<n){ int temp=INT_MAX; while (!strcmp(cmps[i].name,cmps[j].name)&&j<n){ if(cmps[j].qual>=q){ temp=min(temp,cmps[j].price); ++j; }else{ j++; } } if(temp==INT_MAX||sum+temp>budget){ break; }else{ sum+=temp; i=j; } } if(i<n||sum>budget){ high=mid-1; }else{ ans=mid; low=mid+1; } } printf("%d\n",qual[ans]); } return 0; }
相关文章推荐
- UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)
- zoj 3963 Heap Partition(并查集,贪心,二分)
- UVaLive 3971 Assemble (水题二分+贪心)
- ZOJ 3778 Talented Chef (贪心+二分)
- uvalive 3971 - Assemble(二分搜索 + 贪心)
- uvalive 3971 - Assemble(二分搜索 + 贪心)
- ZOJ 3908 Number Game (贪心+二分+multiset)
- ZOJ 2968 Difference Game 【贪心 + 二分】
- UVALive 3971 Assemble 电脑配件 二分+贪心
- UVALIVE 3971 Assemble 二分+贪心
- UVA 12124 Assemble(贪心 二分)
- (ZOJ) 3334 二分+贪心(二分double的写法)
- ZOJ 2002 Copying Books 二分 贪心
- uvalive 3971 - Assemble(二分搜索 + 贪心)
- zoj 3820 Building Fire Stations(贪心 + 二分)
- ZOJ 3820 Building Fire Stations (二分+贪心) 2014 牡丹江现场赛B
- UVALive 3971 Assemble(二分+贪心)
- zoj-3963 Heap Partition(贪心+二分+树状数组)
- UVALive 3971 Assemble(二分 + 贪心)
- ZOJ 3963 Heap Partition( 并查集 + 贪心 +二分 )