题目描述 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
数据范围不大,不用考虑。
思路:按结束时间排个序,然后贪心的取即可(注意活动占用的时间t是将所选的每一个活动占用的时间相加)
然后这题我只过了50%的数据,后面数据有误。
这些是什么鬼数据??
下面是过了50%的代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
struct node
{
long long int b,e;
int number;
};
node s[N];
int num[N];
bool cmp(node x,node y)
{
if(x.e<y.e)
return 1;
else
return 0;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i].b>>s[i].e;
s[i].number=i+1;
}
sort(s,s+n,cmp);
int f=1;
long long int end=s[0].e;
long long int sum=0;
num[0]=s[0].number;
sum+=s[0].e-s[0].b+1;
for(int i=1;i<n;i++)
{
if(s[i].b>end)
{
end=s[i].e;
sum+=s[i].e-s[i].b+1;
num[f]=s[i].number;
f++;
}
}
cout<<sum<<endl;
sort(num,num+f);
cout<<num[0];
for(int i=1;i<f;i++)
cout<<" "<<num[i];
return 0;
}