[贪心] 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)输出输出最小总罚款样例输入
样例输出
这题花了我蛮长时间,一开始想法错了(用结构体快排根据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;
}
总时间限制:
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;
}
相关文章推荐
- 【贪心】 noi openjudge 4.6 Ride to Office
- openjudge 区间合并(贪心)
- noi.openjudge 2469:电池的寿命 贪心
- open judge 特殊的密码锁 贪心
- 算法导论之贪心算法:带惩罚的任务调度算法
- leetcode - 646. Maximum Length of Pair Chain 【贪心 + 快排的应用+ 任务调度问题】
- 第十二题 任务调度的贪心
- 贪心算法--电影节(openjudge 4151 )
- 贪心 任务调度问题
- OpenJudge - 2704 寻找平面上的极大点 贪心+使用map优化 重庆一中高2018级竞赛班第九次测试 2016.9.10 Problem 1
- 任务调度 简单贪心
- hdu 1789 任务调度 贪心或dp
- 图的点着色、区间着色问题及其应用(基于贪心思想的DFS回溯法求点着色问题和区间着色算法求解任务调度问题)
- 算法导论 第十六章:贪心算法之单任务调度问题
- 多核动态任务调度的进一步探索
- 优先级调度:优先级高的任务先执行。
- Oracle DB 使用调度程序自动执行任务
- Quartz 任务调度(一)
- PL/SQL实现Oracle数据库任务调度PL/SQL实现Oracle数据库任务调度
- 任务调度框架