333 3 310 5 131 3 16 2 371 4 6 4 2 4 33 2 1 7 6 5 4 Sample Output035
说一下题目的思路(做法):
肯定是先做分数高的,所以对分数进行由小到大的排序,完成分数最高的之后找分数第二高的,往分数最高的前面排,再是第三高的,,在往前排若该天有未完成的任务,则放弃该天的任务,算作扣的分数里,再以此类推。
解释一下最后一组测试数据:
排好序后就是 7 6 5 4 3 2 1,对应的天数为:4 2 4 1 4 6;
是这么排的: 1 2 3 4 5 6
7(第四天完成)
1 2 3 4 5 6
6 7 6(第三天完成)
1 2 3 4 5 6
5 6 7(5第二天完成)
1 2 3 4 5 6
4 5 6 7(4第一天完成)
1 2 3 4 5 6
4 5 6 7 6(其中再是3,2,但是3,2应该完成的时间被占了,所以不能完成,最后剩下了1,最后一天完成)
已经AC过的代码:
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;struct M{ int date,score;} A[1005];//定义了一个结构体,把天数和分数放在一起int bigger(const M &a,const M &b){ return a.score>b.score;}这是使用结构体的排序int main(){ int t,n; int in[1005]; scanf("%d",&t); while(t--) { int ans=0; memset(in,0,sizeof(in)); scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&A[i].date); } for(int i=0; i<n; i++) scanf("%d",&A[i].score); sort(A,A+n,bigger);//把分数进行由大到小排序 for(int i=0; i<n; i++)//先从最大的开始,逐渐递减 { int j; for(j=A[i].date; j>=1; j--)//最大的在该天完成,接着天数递减 { if(!in[j])//如果该天没有被其他的任务,则为真。若该天有任务,但是时间已经被其他的科目占据,则为假,若没有,则为真。 { in[j]=true; break;//如果没有被占据,则跳出循环 } } if(!j) ans+=A[i].score;//如果该天完成了其他作业,而应该在这天写的作业未完成,则加上去 } cout<<ans<<'/n'; } return 0;}
新闻热点
疑难解答