您的位置:首页 > 其它

贪心专练1 区间调度最多问题

2017-12-17 17:42 169 查看
题意:

问题描述:

有n项工作,每项工作分别在si开始,ti结束。对每项工作,你都可以选择参加或不参加,但选择了参加某项工作就必须至始至终参加全程参与,即参与工作的时间段不能有重叠(即使开始的时间和结束的时间重叠都不行)。

限制条件:

1<=n<=100000

1<=si<=ti,=109
样例:

输入

n=5

s={1,2,4,6,8}

T={3,5,7,9,10}

输出

3(选择工作1, 3, 5)

—————————————————————————————————————————————

详解见白书:最优规则是:选取结束时间最短的工作。

#include <stdio.h>
struct
{
int end;
int start;

}time[1000],swap;

int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j;
int sum=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&time[i].start,&time[i].end);
}
for(i=1;i<n;i++)//排序是关键:把结束时间最早的工作排在最前面,而开始时间的选取只需要大于上一工作的开始即可
{
for(j=n-1;j>=i;j--)
{
if(time[j].end<time[j-1].end)
{
swap=time[j];
time[j]=time[j-1];
time[j-1]=swap;
}
}
}
int t=0;
for(i=0;i<n;i++)
{
if(t<time[i].start)//对于结束时间重和而开始时间不同该选取谁问题可以忽略,只要结束时间相同,不论选谁工作个数都只是增加一。
{
sum++;
t=time[i].end;//更新t
}
}
printf("最多可参与工作数目为 :%d\n",sum);
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: