原题: http://acm.hdu.edu.cn/showproblem.php?pid=1789
//题目大意:知道所有作业的截至时间,以及超过截至时间要扣的分数,编写程序写一个解决方案使得扣的分数少
//思路:贪心,按找作业扣的分数由大到小排序,选择离作业截至时期最近的时间做作业。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct H
{
int d;
int k;
}h[1001];
int cmp(H a,H b)
{
if(a.k!=b.k)
{
return a.k>b.k;//a比b扣的分多
}else{
return a.d<b.d;//a比b要急
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int f[1001]={0};
for(int i=0;i<n;i++)
{
scanf("%d",&h[i].d);
}
for(int i=0;i<n;i++)
{
scanf("%d",&h[i].k);
}
sort(h,h+n,cmp);
//每一个作业都要找临近的时间
int ans=0;
for(int i=0;i<n;i++)//遍历每一个作业
{
int t=h[i].d;
while(f[t]==1 && t>=1){
t--;
}
if(t==0)
{
ans=ans+h[i].k;
}else{
f[t]=1;
}
}
printf("%d\n",ans);
}
return 0;
}
本文介绍了一道经典的贪心算法题目,通过将作业按照扣分多少排序,并寻找最接近截止日期的时间来完成作业,以最小化总扣分。文章详细解释了算法的实现思路及代码细节。
933

被折叠的 条评论
为什么被折叠?



