P1230 智力大冲浪

https://www.luogu.com.cn/problem/P1230
涉及知识点:贪心,排序
黄色题
思路:
先完成会罚款高的游戏明显更有益(时间消耗相同),所以,先要对游戏的罚款进行排序(从大到小)。

第二点,排完序后,就要考虑这个游戏放在那个时间来做,很明显,我们要先处理罚款大的项,而又尽量不影响后面的游戏,只能将这个游戏放在规定最晚完成的时间段0-t的最后面t来做,若后面已经有游戏正在进行,可以考虑t-1,直到0,如果还没有对它进行安排,则这个游戏主动放弃0

最后,将放弃的游戏的罚款减去,即为所求解。


1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 struct lao{ 6 int t,f; 7 8 }a[300000];// t代表最晚完成时间,f代表罚款。 9 bool used[100000]={0};//统计这个时间是否被游戏占领。 10 bool cmp(const lao &x,const lao &y) 11 { 12 return x.f>y.f;//返回罚款较大的。 13 } 14 int main() 15 { 16 int s=0,b; 17 int m,n,i,j; 18 scanf("%d%d",&m,&n); 19 for(i=1;i<=n;i++) 20 scanf("%d",&a[i].t); 21 for(i=1;i<=n;i++) 22 scanf("%d",&a[i].f); 23 sort(a+1,a+1+n,cmp);//根据罚款进行从大到小排序。 24 for(i=1;i<=n;i++)//从罚款最大的游戏进行处理。 25 { 26 27 for(j=a[i].t;j>=1;j--)//从最晚完成的时间判断,若被占领,则向前一步判断。 28 { 29 if(used[j]==0)//代表该时间无游戏占领。 30 { 31 used[j]=1; 32 a[i].f=0;//将占领的游戏的罚款变为零,因为按时完成了吗。 33 break;//重点,保证一个游戏只占领一个时间。占领后立刻结束循环。 34 } 35 } 36 37 38 39 } 40 for(i=1;i<=n;i++) 41 s=a[i].f+s;//统计罚款的总额 42 m=m-s;//m即为小伟最多能赢的钱。 43 printf("%d",m); 44 45 } 46

 


__EOF__

本文作者灰の魔女伊蕾娜
本文链接https://www.cnblogs.com/2elaina/p/16478828.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   -イレイナ  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示