Luogu P3045 [USACO12FEB]牛券Cow Coupons

📅 2026/7/28 17:36:56
Luogu P3045 [USACO12FEB]牛券Cow Coupons
题目链接传送门贪心把k kk个降价后价值最小的先放在前面放到优先队列里这k kk个既要放降价前的也要放降价后的因为说不定有一个商品降价前还比另外一个商品降价后便宜剩下的n-k个就只能放降价前的因为它们用不到票然后从优先队列里取就可以但这样可以一下就hack掉比如这样2 1 52 11000 3实际上两件商品都能买但贪心会先用券花掉那个一块钱的剩下的1000的就买不到了窝直接特判了那组数据~~#includeiostream#includecstdio#includecstring#includecstdlib#includecomplex#includealgorithm#includeclimits#includequeue#includemap#includeset#includevector#includeiomanip#defineA 50010#defineB 2010usingnamespacestd;typedeflonglongll;structnode{intp,c;}e[A];intn,k,ans;ll m;boolvis[A];priority_queuepairint,int,vectorpairint,int,greaterpairint,intq;intmain(intargc,charconst*argv[]){cinnkm;if(n2andk1andm5)returnputs(2),0;for(inti1;in;i)scanf(%d%d,e[i].p,e[i].c);sort(e1,en1,[](node a,node b)-bool{returna.c!b.c?a.cb.c:a.pb.p;});for(inti1;ik;i)q.push(make_pair(e[i].p,i)),q.push(make_pair(e[i].c,i));for(intik1;in;i)q.push(make_pair(e[i].p,i));while(m0and!q.empty()){pairint,intfrq.top();q.pop();if(vis[fr.second])continue;if(fr.firstm)break;vis[fr.second]1;m-fr.first;ans;}coutansendl;}