[题目] Section 1.2 Milking Cows(USACO)

来源:互联网 发布:算法复杂性影响因素 编辑:程序博客网 时间:2024/06/07 10:44

[题意]给出N组挤牛奶的开始时间和结束时间,求有人挤牛奶和没人挤牛的最长时长。

[思路]尝试了一种“记忆”的方法,避免了复杂的判断。思路是用数组a[]标记有人挤的时间点,b[]标记没人挤的时间点。也就是说这两个数组的01情况正好相反。如果当前已被标记那么a[i]+=a[i-1],b[i]+=b[i-1]。然后遍历这两个数组分别找出最大值,这两个最大值就是答案。

[代码]

#include<iostream>#include<cmath>#include<cstdio>using namespace std;int a[1000001],b[1000001];int main(){    int n,be,en;    while(cin>>n){        int END=0,BEG=1000001;        int maxa=-1,maxb=-1;        while(n--){            cin>>be>>en;            END=max(END,en);            BEG=min(BEG,be);            for(en-=1;en>=be;en--)                a[en]=1;        }        for(int i=BEG;i<END;i++){            if(!a[i]) b[i]=1;            if(a[i]) a[i]+=a[i-1];            if(b[i]) b[i]+=b[i-1];            maxa=max(maxa,a[i]);            maxb=max(maxb,b[i]);        }        cout<<maxa<<' '<<maxb<<endl;    }}


0 0