您的位置:首页 > 运维架构

[贪心] OpenJudge nnsz 001任务调度

2014-04-25 21:06 246 查看
原题:
总时间限制:

10000ms内存限制: 30720kB描述一个单位时间任务是一个作业,如要在计算机上运行一个程序,它恰覆盖一个单位的运行时间。给定一个单位时间任务的集合S,对S的一个调度即S的一个排列,其中规定了这些任务的执行顺序。该调度中的第一个任务开始于时间0,结束于时1;第二个任务开始于时间1, 结束于时间2;……。单处理器上具有期限和罚款的单位时间任务调度问题的输入如下:

1.包含n个单位时间任务的集合S={1,2,……,n};

2.n个取整的期限d1,……,dn,(1≤d,≤n),任务i要求在di前完成;

3.n个非负的权(或罚款)w1,……,wn。如果任务i没在时间di之前结束,则导致罚款wi;

要求找出S的一个调度,使之最小化总的罚款。输入输入第一行为N<=1000,后面N行每行两个数,即为对应的di与wi。(wi<=1000)输出输出最小总罚款样例输入
5
1 4
2 4
2 8
3 8
5 2

样例输出
4


这题花了我蛮长时间,一开始想法错了(用结构体快排根据d从小到大优先,w从大到小其次排一遍,然后一个个放进去) 因为不能跟据时间先后判断,时间前面的不一定代价大

正解是:先根据d排一遍,然后建立标记now,一个个放进去,每次放进去如果>now,就直接放,else就看看前面(<=now)是否有代价小于当前的,有的话把里面最小的换出来,把这个加进去,这样就完事了

源码:#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;

struct work
{
int d,w;
};
work a[1001];

bool cmp(work x,work y)
{
return x.d<y.d;
}

int n,ans,now,b[1001];
int find()
{
int min=99999,tmp;
for(int i=1;i<=now;i++)
{
if(b[i]<min) { min=b[i]; tmp=i; }
}
return tmp;
}
int main()
{
ans=0; now=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a[i].d,&a[i].w);
}
sort(a+1,a+1+n,cmp);
for(int j=1;j<=n;j++)
{
if(now<a[j].d) { now++; b[now]=a[j].w; }
else
{
int t=find();
if(a[j].w>b[t]) { ans+=b[t]; b[t]=a[j].w; }
else { ans+=a[j].w; }
}
}
printf("%d",ans);
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心