标签:
2
3
3 3 3
10 5 1
3
1 3 1
6 2 3
0
3
解题思路:题目要求输出扣最少的分数,看的第一眼感觉非常简单,于是先按照所给的期限升序排序,然后顺着看,当所给期限早于分配到的期限时就记上这一个。结果提交不对。
然后又按照分数降序排序,再顺着看所给期限与分配到的位置,结果提交仍然不对。
最后恍然大悟,应该是自己给它分配时间,首先所扣分数按照降序排列,然后取第一个,从他所给期限的最晚时间开始安排,如果这一天已经有安排,安排到前一天。。。这样先让扣分最多的有着落,最后剩下扣分少的,才是扣最少分的正确策略。
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; struct node{ int date; int score; int sd; }; node subject[1005]; int cmp(node a,node b){ //return a.date<b.date||a.date==b.date&&a.score>b.score; return a.score>b.score||a.score==b.score&&a.date<b.date; //return a.sd>b.sd; } int main() { int t; int n; int s=0; int b[1005]={0}; scanf("%d",&t); for(int j=0;j<t;j++){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&subject[i].date); } for(int i=1;i<=n;i++){ scanf("%d",&subject[i].score); subject[i].sd=0; } sort(subject+1,subject+n+1,cmp); for(int i=1;i<=n;i++){ for(int ii=subject[i].date;ii>0;ii--){ if(b[ii]==0){ b[ii]=1; subject[i].sd=1; break; } } if(subject[i].sd==0){ s+=subject[i].score; } } printf("%d\n",s); s=0; memset(b,0,sizeof(b)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/TWS-YIFEI/p/5690116.html