题目链接:http://ace.delos.com/usacoprob2?a=RfmQrEONAFb&S=milk2用一个farmer_count变量来记录当前的farmer的数量。当farmer从0到1时,说明有人开始进来挤扔了,
计算一下之前的无人状态的时间。当farmer从1到0时,说明最后一个农夫离开了,计算一下之前的有人挤奶状态。
在输入的时候,每个农夫的进入和离开时间各加一个结点.
代码如下:
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("milk2.in");
ofstream fout("milk2.out");
#ifdef _DEBUG
#define out cout
#define in cin
#else
#define out fout
#define in fin
#endif
struct node{
int value; //时间
int kind; //kind==0为到达时间,kind==1为离开时间
};
node nodes[10001];
bool operator<(const node &n1, const node&n2)
{
if(n1.value!=n2.value)
return n1.value<n2.value;
else
/*
如果某一时刻有人来,有人走,这个时刻应该是算成milking的。
所以把到达的排在前面,这样在这个时刻就不会判断为unmilking状态了。
*/
return n1.kind<n2.kind;
}
void solve()
{
int num;
in>>num;
int begin,end;
for(int i=0;i<num;++i){
in>>begin>>end;
nodes[2*i].value = begin;
nodes[2*i].kind = 0;
nodes[2*i+1].value = end;
nodes[2*i+1].kind = 1;
}
int last_milk_time = nodes[0].value;
int last_unmilk_time = INT_MIN;
//对时间进行排序,因为sort的区间是左闭右开的,所以要取nodes的最后一位的下一位
//TIC资格赛的时候因为这个问题WA了几次。。。
sort(&nodes[0],&nodes[2*num]);
int max_milked,max_unmilked;
//最长取奶时间,最长未取奶时间
max_milked = max_unmilked = 0;
//当前的农夫数
int farmer_count = 0;
for(int i=0;i<2*num;++i){
if(nodes[i].kind==0){
if(farmer_count==0){
//农夫数从0到有,说明从无人状态到有人状态
max_unmilked = max(max_unmilked,nodes[i].value-last_unmilk_time);
last_milk_time = nodes[i].value;
}
farmer_count++;
}else{
if(farmer_count==1){
//农夫数从1到0,说明从有人状态到无人状态
max_milked = max(max_milked,nodes[i].value-last_milk_time);
last_unmilk_time = nodes[i].value;
}
farmer_count--;
}
}
//max_unmilked最大为0.
out<<max_milked<<" "<<max(max_unmilked,0)<<endl;
}
int main(int argc,char *argv[])
{
solve();
return 0;
}