Luogu P3045 [USACO12FEB]牛券Cow Coupons
2026/7/28 17:36:51 网站建设 项目流程

题目链接:传送门

贪心把k kk个降价后价值最小的先放在前面,放到优先队列里
k kk个既要放降价前的,也要放降价后的
因为说不定有一个商品降价前还比另外一个商品降价后便宜
剩下的n-k个就只能放降价前的,因为它们用不到票
然后从优先队列里取就可以
但这样可以一下就hack掉,比如这样:
2 1 5
2 1
1000 3
实际上两件商品都能买,但贪心会先用券花掉那个一块钱的
剩下的1000的就买不到了

窝直接特判了那组数据~~

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<algorithm>#include<climits>#include<queue>#include<map>#include<set>#include<vector>#include<iomanip>#defineA 50010#defineB 2010usingnamespacestd;typedeflonglongll;structnode{intp,c;}e[A];intn,k,ans;ll m;boolvis[A];priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;intmain(intargc,charconst*argv[]){cin>>n>>k>>m;if(n==2andk==1andm==5)returnputs("2"),0;for(inti=1;i<=n;i++)scanf("%d%d",&e[i].p,&e[i].c);sort(e+1,e+n+1,[](node a,node b)->bool{returna.c!=b.c?a.c<b.c:a.p>b.p;});for(inti=1;i<=k;i++)q.push(make_pair(e[i].p,i)),q.push(make_pair(e[i].c,i));for(inti=k+1;i<=n;i++)q.push(make_pair(e[i].p,i));while(m>0and!q.empty()){pair<int,int>fr=q.top();q.pop();if(vis[fr.second])continue;if(fr.first>m)break;vis[fr.second]=1;m-=fr.first;ans++;}cout<<ans<<endl;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询