【codevs 2610】活动选择

来源:互联网 发布:mac查看系统版本 编辑:程序博客网 时间:2024/06/05 21:52

题目描述 Description
假设有一个需要使用某一资源的n(n≤1000)个活动组成的集合S,S={1,…,n}。该资源一次只能被一个活动占有,每一个活动有一个开始时间bi和结束时间ei(bi≤ei)。若bi>ej或者bj>ei,则活动i和活动j兼容。

你的任务是是:选择由互相兼容的活动组成的最大集合。

输入描述 Input Description
共n+1行,其中第1行为n,第2行到第n+1行表示n个活动的开始时间和结束时间(中间用一个空格隔开),格式为:

n

b1 e1

…….

bn en

输出描述 Output Description
共有两行,第1行为满足要求的活动占用的时间t,第2行为最大集合中的活动序号,每个序号之间用一个空格隔开。

样例输入 Sample Input
11

3 5

1 4

12 14

8 12

0 6

8 11

6 10

5 7

3 8

5 9

2 13

样例输出 Sample Output
14

2 3 6 8

数据范围及提示 Data Size & Hint
数据范围不大,不用考虑。

贪心
按照结束时间早晚排个序
兼容则加上,否则不加

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1000+10;int n,k,sum;int d[maxn],s[maxn];struct p{    int s,e,g;}a[maxn];bool cmp(p a,p b){    return a.e<b.e;}int main(){    int l=1;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d%d",&a[i].s,&a[i].e);        a[i].g=i;    }    sort(a+1,a+1+n,cmp);    k++;    d[k]=a[1].g;    sum+=a[1].e-a[1].s+1;    for(int i=2;i<=n;i++)    {        if(a[i].s>a[l].e)        {            l=i;            k++;            d[k]=a[i].g;            sum+=a[i].e-a[i].s+1;        }    }    cout<<sum<<'\n';    for(int i=1;i<=k;i++)    {        s[i]=d[i];    }    sort(s+1,s+k+1);    for(int i=1;i<=k;i++)    {        cout<<s[i]<<' ';    }    cout<<'\n';    return 0;}

然而。。。
这里写图片描述
测试数据有误??

以后做题还是先看看通过率吧。。
这里写图片描述

233.

原创粉丝点击