USACO 1.2 Milking Cows

题目链接: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;
}



posted on 2009-06-04 21:42 YZY 阅读(940) 评论(0)  编辑 收藏 引用 所属分类: AlgorithmUSACO


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜