码迷,mamicode.com
首页 > 其他好文 > 详细

北大ACM2376——Cleaning Shifts

时间:2015-05-08 09:33:38      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:acm   北大   

这一题,简单的贪心,可是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;
}


北大ACM2376——Cleaning Shifts

标签:acm   北大   

原文地址:http://blog.csdn.net/qq_25425023/article/details/45568705

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!