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  

 

posted @ 2022-07-14 18:07  -イレイナ  阅读(157)  评论(0)    收藏  举报