老组长在百度商务搜索部,他说平时工作其实很少用算法 最多用个贪心 hash表
今儿就做个贪心 hdu的
题意就是 一个hdu的神牛从world final英勇归来了。然后他要补作业。。
一共n个作业 完成每个作业都需要一天。但是每个作业有截止日期 如果超过了截止日期 就会扣分
给出 n个作业的截止日期 和 如果超过截止日期要扣的分 现在要计算 怎么设计做作业的顺序扣分最少 计算出这个最少的扣分值
这个是赤裸裸的贪心啊。贪心策略肯定是先解决权值影响最大的。
这样 我们把扣分从大到小sort 从大的开始解决 一共n个用n天 从头开始 安排在截止日期 如果满了 就往前 如果前面全满了那这分一定得口了 就ans+=这个作业的扣分 安排在后面不用管了
开始敲代码了。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1001;
struct Node
{
int deadline,subscore;
bool operator < (const Node & n)const
{
return (subscore>n.subscore || (subscore==n.subscore && deadline<n.deadline));
}
};
Node arr[maxn];
bool taken[maxn];
int main()
{
int t,n,i,j,ans;
Node node;
scanf("%d",&t);
while(t--)
{
memset(taken,0,sizeof(taken));
scanf("%d",&n);
for(i=0; i<n; ++i)
scanf("%d",&arr[i].deadline);
for(i=0; i<n; ++i)
scanf("%d",&arr[i].subscore);
sort(arr,arr+n);
ans=0;
for(i=0; i<n; ++i)
{
bool ok=0;
for(j=arr[i].deadline; j>=1; j--)
{
if(!taken[j])
{
taken[j]=1;
ok=1;
break;
}
}
if(!ok)
ans+=arr[i].subscore;
}
printf("%d\n",ans);
}
return 0;
}