USACO 1.3.1 Milking Cows
解析
看来是个测试用例很弱的题,可以直接用数组表示时间段,然后遍历计算最长时间即可。
luogu的题解中差分的方法,但是我还不知道什么是差分orz
官方的题解是用stuct 表示一个时间段,存入数组,然后按起始时间sort,再遍历处理这个结构数组
还是很巧妙的。
代码
个人的暴力解法
/*
PROG:milk2
ID:imking022
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;
const int max_size = 1000002;
typedef pair<int,int> P;
void set1(bool cot[],int start, int len,bool w){
for(int i=start;i< start+len;i++){
cot[i] = w;
}
}
int main(void){
freopen("milk2.out","w",stdout);
freopen("milk2.in","r",stdin);
int n;
cin>>n;
P *cot = (P *) malloc(n*sizeof(P));
int str , ed;
str=ed = 0;
for(int i=0;i<n;i++) {
cin>>cot[i].first>>cot[i].second;
str = min(str,cot[i].first);
ed = max(ed,cot[i].second);
}
bool area[max_size];
memset(area,false,max_size);// only false
int len;
// set 1
for(int i=0;i<n;i++){
len = cot[i].second - cot[i].first;
set1(area,cot[i].first, len,true);
}
int mlen = 0, midle=0;
// cal for longest milking & non-milling time
int s1 = 0,s2 = 0;
for(int i=str;i<ed;i++){
if(area[i] == true ) {
s1++;
mlen = max(s1,mlen);
}
else s1 = 0;
if(area[i] == false){
s2++;
midle = max(s2,midle);
}
else s2 = 0;
}
cout<<mlen<<" "<<midle<<endl;
return 0;
}