期末考试
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
马上就要考试了,小T有许多作业要做,而且每个老师都给出来了作业要交的期限,如果在规定的期限内没交作业就会扣期末成绩的分数,假设完成每门功课需要一天的时间,你能帮助小T扣除的分数最小吗?
-
输入
-
输入n,表示n门功课(n<2000),接下来n行,每行两个数a,b,分别表示交作业的最后期限,迟交扣除的分数。
(以文件结尾)
输出
- 输出扣除的最小分数。 样例输入
-
3 3 10 3 5 3 1 3 1 6 3 2 1 3 7 1 3 4 2 6 1 4 7 2 6 4 5 3 4
样例输出
-
0 3 5
上传者
-
TC_常红立
思路就是 按照分数从大到小排序,保存当前分数的天数,如果这个天数已经有分数,就把分数保留在前一天,,,,最后剩下的就是扣除的
AC:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int b[2010]; struct dudu { int t; int f; } a[2010]; int cmp(dudu a,dudu b) { if(a.f==b.f) return a.t<b.t; else return a.f>b.f; } int main() { int n; while(~scanf("%d",&n)) { int sum=0; memset(b,0,sizeof(b)); for(int i=0; i<n; i++) { scanf("%d%d",&a[i].t,&a[i].f); } sort(a,a+n,cmp); for(int i=0; i<n; i++) { if(b[a[i].t]==0) b[a[i].t]=a[i].f; else {int q=a[i].t; while( b[q]!=0) { q--; if(q==0) break; } if(q>=1) b[q]=a[i].f; else sum+=a[i].f; } } printf("%d\n",sum); } }
-
输入n,表示n门功课(n<2000),接下来n行,每行两个数a,b,分别表示交作业的最后期限,迟交扣除的分数。