您的位置:首页 > 大数据 > 人工智能

HDU 1789 Doing Homework again 贪心 DP

2016-12-26 12:02 513 查看
传送门:HDU 1789 Doing Homework again

分析:

这里默认作业的期限 也不会超过1000 所以我们vis数组也就是开的1010 果不其然 数据并没有超过100的

贪心策略:排序预处理 + 期限尽量从后面开始考虑。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define ms(x, y) memset(x, y, sizeof(x))
const double PI = acos(-1.0), eps = 1e-8;
struct homeW {
int deadl,scor;
}h[1010];
bool vis[1010];
int cmp(homeW a, homeW b) {
if(a.scor == b.scor)
return a.deadl < b.deadl;
return a.scor > b.scor;
}
int main() {
int cas,i,j,n;
scanf("%d",&cas);
while(cas--) {
scanf("%d",&n);
// ms(dp, 0);
ms(vis, 0);
// maxDead = -1;
for(i=1; i<=n; i++)
scanf("%d",&h[i].deadl);
for(i=1; i<=n; i++)++
scanf("%d",&h[i].scor);

// 期限升序  扣分降序排序 (弄反了 扣分优先考虑)
sort(h+1, h+n+1, cmp);

int sum = 0;
for(i=1; i<=n; i++) { // 对已按优先度排序后的序列进行预定
for(j=h[i].deadl; j>=1; j--) { // 期限尽量从后面开始考虑
if(!vis[j]) {
vis[j] = 1; // 预定期限
break;
}
}
if(j == 0)
sum += h[i].scor;
}
printf("%d\n",sum);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 贪心