【二分答案】Google Code Jam Round 1A 2018
题意:有R个机器人,去买B件商品,有C个收银员,每个收银员有能处理的商品数量上限mi,处理单件商品所需的时间si,以及最后的装袋时间pi。
每个收银员最多只能对应一个机器人,每个机器人也最多只能对应一个收银员。
让你给每个机器人安排他购买的商品数,以及对应哪个机器人,问你最少需要多长时间才能买回所有商品。
二分答案lim,将收银员按照min(m[i],(lim-p[i])/s[i])(此即为该收银员在当前限制下能处理的商品数)从大到小排序,贪心加入,看是否满足即可。
#include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int T,r,b,c,m[1005],s[1005],p[1005]; int id[1005]; ll lim; bool cmp(const int &a,const int &b){ return min((ll)m[a],(lim-(ll)p[a])/(ll)s[a]) > min((ll)m[b],(lim-(ll)p[b])/(ll)s[b]); } bool check(){ ll sum=0; sort(id+1,id+c+1,cmp); for(int i=1;i<=min(r,c);++i){ if(lim<(ll)p[id[i]]){ continue; } sum+=min((ll)m[id[i]],(lim-(ll)p[id[i]])/(ll)s[id[i]]); if(sum>=(ll)b){ return 1; } } return sum>=(ll)b; } int main(){ //freopen("b.in","r",stdin); scanf("%d",&T); for(int zu=1;zu<=T;++zu){ printf("Case #%d: ",zu); scanf("%d%d%d",&r,&b,&c); for(int i=1;i<=c;++i){ id[i]=i; } for(int i=1;i<=c;++i){ scanf("%d%d%d",&m[i],&s[i],&p[i]); } ll l=1ll,r=1000000000000000000ll; while(l<r){ lim=(l+r)/2ll; if(check()){ r=lim; } else{ l=lim+1ll; } } printf("%lld\n",l); } return 0; }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/