http://acm.hdu.edu.cn/showproblem.php?pid=1789
/*
http://acm.hdu.edu.cn/showproblem.php?pid=1789
贪心:
对 score 进行 按 分数高低 排序 ,score 相同的 deadline 小的 排前面
对 score 进行遍历, 每次 都将 score 大的 安排在 对应的 deadline 那天,
如果 那一天 被安排了作业, 则往前 寻找 空闲的 日子 ,如果 没有找到,则说明 这个作业不能完成
这样 总的 reduce score 就是 最小的
*/
#include <stdio.h>
#include <string.h>
int deadline[1010],score[1010];
int sche[1010];
void swap(int max, int i)
{
if(score[max] < score[i])
{
int temp = deadline[max];
deadline[max] = deadline[i];
deadline[i] = temp;
temp = score[max];
score[max] = score[i];
score[i] = temp;
}
else if(deadline[max] > deadline[i])
{
int temp = deadline[max];
deadline[max] = deadline[i];
deadline[i] = temp;
temp = score[max];
score[max] = score[i];
score[i] = temp;
}
}
void mysort(int n)
{
int i,j;
for(i=0; i<n-1; i++)
{
for(j=1; j<n-i; j++)
{
if(score[j-1] <= score[j])
swap(j-1,j);
}
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int cas;
scanf("%d",&cas);
while(cas--)
{
memset(deadline,0,sizeof(deadline));
memset(score,0,sizeof(score));
memset(sche,0,sizeof(sche));
int n,i;
scanf("%d",&n);
for(i=0; i<n; i++)
scanf("%d",&deadline[i]);
for(i=0; i<n; i++)
scanf("%d",&score[i]);
mysort(n);
int reduce = 0;
for(i=0; i<n; i++)
{
int day = deadline[i]-1; // 将deadline 对应到 数组 中的 0...
while(sche[day]!=0 && day >=0)
day--;
if(day < 0)
reduce += score[i];
else
sche[day]=1;
}
+ printf("%d\n",reduce);
}
return 0;
}