USACO第四题Milking Cows

虽然有明显的贪心思想,我还是有足够的wa去纠结。奶牛貌似很受美国人欢迎,哪儿都有。由于英语不太好,题目看的不明不白,尤其是细节方面的东西。比如有可能没有间隔,那就得输出0,要是不看测试数据今晚都得纠结在这。硬是逼我加了个flag进去。虽然这手段比较猥琐,但是用惯了。还有需要注意的就是可能有个区间被另外一个区间包含也说不定,测试数据总是会想方设法挑你毛病,如果多看看测试数据,没准还能上TC上去找别人的茬。快排加上几个细节,这个入门题就没什么难的了。

/*
ID: like_091
PROG: milk2
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
using namespace std;
const int MAX = 5001;
struct Node{
	int start, end;
}node[MAX];
//为qsort准备的自定义比较函数,很有用
int cmp(const void *a, const void *b)
{
	struct Node *c = (Node *)a;
	struct Node *d = (Node *)b;
	if (c->start != d->start)
		return c->start - d->start;
	else
		return d->end - c->end;
}
int main(void)
{
	ifstream cin("milk2.in");
	ofstream cout("milk2.out");
	int n, maxx, minx, temp;
	short i;
	cin>>n;
	for (i = 0; i < n; i++)
		cin>>node[i].start>>node[i].end;
	qsort(node, n, sizeof(node[0]), cmp);
	maxx = -1;//只要有输入,初始化为-1总没错的
	minx = 0;//小心只有一行数据,初始化为0
	bool flag = true;
	temp = node[0].end - node[0].start;
	for (i = 1; i < n; i++)
	{
		if (node[i].start <= node[i - 1].end)
		{
			if (node[i].end > node[i - 1].end)
				temp += (node[i].end - node[i - 1].end);
			else
				node[i].end = node[i - 1].end;
		}
		else {
			if (maxx < temp)
				maxx = temp;
			if (flag)
			{
				//我承认此处比较那个,你懂的
				minx = node[i].start - node[i - 1].end;
				flag = false;
			}
			//注意是求最大的,不要因此wa
			if (minx < node[i].start - node[i - 1].end)
				minx = node[i].start - node[i - 1].end;
			temp = node[i].end - node[i].start;
		}
	}
	//按我的理解后面这一步是不能省的
	if (maxx < temp)
		maxx = temp;
	cout<<maxx<<" "<<minx<<endl;
	return 0;
}
posted @ 2011-02-18 20:29  like@neu  阅读(287)  评论(0编辑  收藏  举报