题目描述 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.