这道题感觉最难的就是看你题意怎么理解了。。。
在经过多次百度之后,终于理解了,题意。。
抽象出来就是给你几组数组,每组数字都代表了开始和结束,现在让你计算在开始时间到结束时间最多可以包含几组这样的数字,并且输出他们的编号(输入的顺序)
一个贪心解决,对结束时间,进行升序排列。优先选择最先结束的,这样就可以选的最多。
代码如下:
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 50005;
struct info
{
int start, end;
int id;
};
info date[N];
int n;
bool cmp(const info &a, const info &b)
{
return a.end < b.end;
}
int main()
{
int n;
while (scanf("%d", &n) && n)
{
for (int i = 0; i < n; i++)
{
scanf("%d%d", &date[i].start, &date[i].end);
date[i].id = i+1;
}
sort(date, date+n, cmp);
vector<int> markans;
markans.push_back(0);
for (int i = 1; i < n; i++)
{
if (date[ markans[markans.size()-1] ].end <= date[i].start)
markans.push_back(i);
}
for (int i = 0; i < markans.size()-1; i++)
cout << date[markans[i]].id << " ";
cout << date[ markans[markans.size()-1] ].id << endl;
}
return 0;
}