HDOJ-----1789贪心
2016-07-22 19:47
302 查看
Doing Homework again
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11320 Accepted Submission(s): 6649
[align=left]Problem Description[/align]
Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduce
his score of the final test. And now we assume that doing everyone homework always takes one day. So Ignatius wants you to help him to arrange the order of doing homework to minimize the reduced score.
[align=left]Input[/align]
The input contains several test cases. The first line of the input is a single integer T that is the number of test cases. T test cases follow.
Each test case start with a positive integer N(1<=N<=1000) which indicate the number of homework.. Then 2 lines follow. The first line contains N integers that indicate the deadlines of the subjects, and the next line contains N integers that indicate the reduced
scores.
[align=left]Output[/align]
For each test case, you should output the smallest total reduced score, one line per test case.
[align=left]Sample Input[/align]
3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4
[align=left]Sample Output[/align]
0
3
5
[align=left]
[/align]
[align=left]就是老师布置作业,规定时间前没做完就扣分,一门作业要做一天,问最少扣多少分[/align]
[align=left]贪心的变形[/align]
[align=left]先按规定时间升序排列,时间一样,再按扣分降序排列[/align]
[align=left]就好比高数作业星期一截止,没做完扣一分,英语作业星期二截止,没做完扣20分。物理作业星期三截止没做完扣90分,[/align]
[align=left]语文作业也是星期三截止,没做完扣60分,就要用星期一做语文作业,星期二做英语作业,星期三做物理作业,高数老师[/align]
[align=left]罚就让他罚吧,反正扣一分[/align]
[align=left]嗯,对高数满满的恶意--------[/align]
[align=left]
[/align]
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node{ int a, b, c; }s[10010]; bool cmp(node x, node y){ if(x.a == y.a){ return x.b > y.b; } return x.a < y.a; } int main(){ int n, m; scanf("%d", &n); while(n--){ memset(s, 0, sizeof(s)); scanf("%d", &m); for(int i = 0; i < m; i++){ scanf("%d", &s[i].a); } for(int i = 0; i < m; i++){ scanf("%d", &s[i].b); s[i].c = 1; } sort(s, s + m, cmp); int k = 1, ok = 1, ans = 0, j, t; for(int i = 0; i < m; i++){ if(s[i].a >= k){//先把第k天扣分最多的做完 k++; continue; } ok = s[i].b; t = i; for(j = 0; j < i; j++){ if(ok > s[j].b && s[j].c){//如上所述,取出前几天扣分最少的加入扣的总分里,并标记分已被扣除,下次要用扣分倒数第二低的来补 ok = s[j].b; t = j; } } ans += ok; s[t].c = 0; } printf("%d\n", ans); } return 0; }
相关文章推荐
- Dictionary使用自定义类型为KEY
- 基于MVC+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据
- linux shell 编程基础
- Catalyst揭秘 Day2 Catalyst源码初探
- POJ2115C Looooops(2)
- Android内存泄漏简介
- 智慧旅游的c端产品破局
- Android中如何查找内存泄露
- python使用urllib2抓取防爬取链接
- magedu Linux运维学习的第二天
- NodeMCU之旅(一):构建、刷入固件,上传代码
- 正则表达式驼峰标示转下划线
- [编写高质量iOS代码的52个有效方法](二)对象
- java(九九乘法表输出1,3,5,7,9)
- python-pickle/cPickle/glob/tarfile
- CodeForces 699C Vacations
- google地图、高德地图基于基站定位位置纠偏
- 解决Android SDK Manager无法更新的问题[设置代理]
- 剑指offer——和为s的两个数字且乘积最小
- 转载:python使用urllib2抓取防爬取链接