hdu 1789 Doing Homework again

题意:要完成一批作业,假定每一科作业花的时间都为一天,若该科不能在相应的期限能完成,则扣除相应的分数,问完成这些作业最少扣多少分

分析:贪心题

贪心策略:先将作业按扣分值从大到小排序,若大小相等,则按期限从小到大排序。之后,用一个数组标记该天是否已用于完成作业。

依次枚举每一科作业,从该科的期限往左移,若存在一天为用过的,则标记,否则,扣分

View Code
#include<iostream>
#include<algorithm>
#define MAXN 1000+10
using namespace std;
int n;
bool vis[MAXN];
struct work
{
int d,w;
}p[MAXN];
bool cmp(work a,work b)
{
if(a.w!=b.w)
return a.w>b.w;
return a.d<b.d;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&p[i].d);
for(int i=1;i<=n;i++)
scanf("%d",&p[i].w);
sort(p+1,p+n+1,cmp);
memset(vis,false,sizeof(vis));
int ans=0;
for(int i=1;i<=n;i++)
{
int flag=1;
for(int j=p[i].d;j>=1;j--)
{
if(!vis[j])
{
vis[j]=true;
flag=0;
break;
}
}
if(flag) ans+=p[i].w;
}
printf("%d\n",ans);
}
return 0;
}
原文地址:https://www.cnblogs.com/nanke/p/2364121.html