期末考试
时间限制: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_常红立
- //先用sort()排一下序, 然后把元素存储在对头为最小元素的一个数组(优先队列)中,比较更新队中元素,每次取最小分数相加 → → 结果;
-
1 #include <queue> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 struct deliver 7 { 8 int ld, fs; 9 } num[2020]; 10 11 bool cmp(deliver ld,deliver fs) 12 { 13 if(ld.ld == fs.ld) 14 return ld.fs < fs.fs; 15 else 16 return ld.ld < fs.ld; 17 } 18 19 int main() 20 { 21 int i, n; 22 while(~scanf("%d", &n)) 23 { 24 priority_queue <int, vector<int>, greater<int> > q; 25 for(i=0; i<n; i++) 26 scanf("%d %d", &num[i].ld, &num[i].fs); 27 sort(num, num+n, cmp); 28 int sum = 0; 29 for(i=0; i<n; i++) 30 { 31 if(q.size() < num[i].ld) q.push(num[i].fs); 32 else 33 { 34 if(q.top() < num[i].fs) 35 { 36 sum += q.top(); 37 q.pop(); 38 q.push(num[i].fs); 39 } 40 else 41 sum += num[i].fs; 42 } 43 } 44 printf("%d\n", sum); 45 } 46 return 0; 47 }
时间: 2024-10-13 01:37:51