这一题,简单的贪心,可是WR了好多次,坑,原因是输入3 10 1 5 6 10 10 10,这样的1到5,6到10,也算连续的!~~坑了。
下面是AC的代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
class data
{
public:
int first, second;
};
data Da[25005];
int N, T;
int cmp(const data& a, const data& b) //按区间的开头排序,从小到大
{
if(a.first != b.first)
return a.first < b.first;
else
return a.second < b.second;
}
int solve()
{
int ans = 0;
int fir = 0, max = -1;
for(int i = 0; i < N; i++)
{
if(fir + 1 >= Da[i].first) //第i个区间的开头是否大于fir + 1
{
if(max < Da[i].second) //是的,找到区间长度最大的,也就是区间的结尾最大的
max = Da[i].second;
if(max >= T) //到了T了,退出
{
ans++; //数量+1
break;
}
}
else
{
fir = max; //fir = max,也就是等于前面找到的区间结尾最大的
if(fir + 1 < Da[i].first) //中间空了一段,不能连续
return -1;
else //否则i自减,避免跳过了一个
i--;
ans++;
}
}
if(max < T) //不能到T,返回-1;
return -1;
return ans;
}
int main()
{
while(scanf("%d%d", &N, &T) != EOF)
{
for(int i = 0; i < N; i++)
scanf("%d%d", &Da[i].first, &Da[i].second);
sort(Da, Da + N, cmp); //排序
if(Da[0].first > 1)
printf("-1\n");
else
{
int ans = solve();
printf("%d\n", ans);
}
}
return 0;
}原文:http://blog.csdn.net/qq_25425023/article/details/45568705