期末考试
时间限制: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
题目分析:此题的关键是要对数据先排一下序,怎么排问题就来了,
此问题是让尽可能的少扣分,那么就应该按时间来排了,时间短的要尽快做了,但是有可能时间短的分值很低,也不能为了做时间短的而把分值高的给放弃。所以要先按时间排序,时间相等的就按分值排序,都是从小到大排。
排完序就用队列来解决取舍问题,队首存的都是分值最高的科目,队里存的都是做过的科目。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; struct qu { int t; int s; }a[2001]; bool cmp(qu x,qu y) { if(x.t!=y.t) return x.t<y.t; return x.s<y.s; }; int main() { int n; priority_queue<int,vector<int>,greater<int> >q; while(cin>>n) { while(!q.empty()) q.pop(); int i; for(i=0;i<n;i++) cin>>a[i].t>>a[i].s; sort(a,a+n,cmp); int cost=0; for(i=0;i<n;i++) { if(q.size()<a[i].t) // 如果队列长度(长度就是天数,你存一个就要花一天的时间做,当长度大于或等于科目的期限的化此科目就又被放弃的可能,但是不一定被放弃,看下边。 q.push(a[i].s); else { if(q.top()<a[i].s)// 如果这可科目的分值比队首的分值大那么就把队首的科目放弃,接着清除队首存入这个险些被放弃的科目,依次进行(来解决取舍问题) { cost+=q.top(); q.pop(); q.push(a[i].s); } else cost+=a[i].s; } } cout<<cost<<endl; } return 0; }