贪心策略:先按分数从大到小排序,分数一样,再按时间从小到大排序 分最高的越靠近期限完成,越好 话不多说直接看代码
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1789
代码:
#include<cstdio> #include<cstring> #include<algorithm> using std::sort; typedef struct{ int sco, time; }str; str s[1005]; bool vis[1005]; //标记第n天有没有被用 int cmp(str a, str b) //排序 { if(a.sco == b.sco) return a.time < b.time; return a.sco > b.sco; } int main() { int t, n, i, j; scanf("%d", &t); while(t --){ scanf("%d", &n); for(i = 0; i < n; i ++) scanf("%d", &s[i].time); for(i = 0; i < n; i ++) scanf("%d", &s[i].sco); memset(vis, 0, sizeof(vis)); int sum = 0; sort(s, s+n, cmp); for(i = 0; i < n; i ++){ for(j = s[i].time; j >= 1; j --){ //按照时间从后往前查找没有被用过的天数 if(!vis[j]){ vis[j] = 1; break; } } if(j == 0) //如果找到最后都被用了 就算是该分数拿不到了 sum +=s[i].sco; } printf("%d\n", sum); } return 0; }
hdoj 1789 Doing Homework again 【贪心】,布布扣,bubuko.com
hdoj 1789 Doing Homework again 【贪心】
原文:http://blog.csdn.net/shengweisong/article/details/38264387