传送门: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;
}