USACO-Section1.3 Milking Cows (区间问题)

2017-5-30

题目描述

给你几个区间,求出最长的连续长度以及最短的连续长度

解答

最长为1000000,在区间内则赋值为1,否则不操作,最后计算出结果
即可,这种方法耗时比较长,注意区间的开闭问题

代码

/*
ID: 18795871
PROG: milk2
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;

const int N = 1000000;
bool f[N+1];

ifstream fin("milk2.in");
ofstream fout("milk2.out");

void res(int a,int b){
    for (int i=a;i<b;i++) f[i]=true;
} 

int main()
{
    int i,n,a,b,ma=-N,mi=N;
    fin>>n;
    memset(f,false,sizeof(f));
    for (i=0;i<n;i++){
        fin>>a>>b;
        ma=max(a,ma);ma=max(ma,b);
        mi=min(a,mi);mi=min(mi,b);
        res(a,b);
    }
    int res1=-N,res2=-N,sum1,sum2;i=mi;
    while (i<ma){
        sum1=0;sum2=0;
        while (!f[i]&&i<=ma){
            sum1++;i++;
        }
        while (f[i]&&i<=ma){
            sum2++;i++;
        }
        res1=max(res1,sum1);
        res2=max(res2,sum2);
    }
    fout<<res2<<" "<<res1<<endl;
    return 0;
}

或者这么写…其实是一样一样的。

/*
ID: 18795871
PROG: milk2 
LANG: C++
*/ 
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;

ifstream fin("milk2.in");
ofstream fout("milk2.out");

const int N = 1000000;
bool f[N+1];
int n;

int main(){
    int i,j,e,s,mis,mae;
    while (fin>>n){
        mis=N;mae=0;
        memset(f,false,sizeof(f)); 
        for (i=0;i<n;i++){
            fin>>s>>e;
            mis=min(mis,s);
            mae=max(mae,e);
            for (j=s;j<e;j++){
                f[j]=1;
            }
        }
        int l=0,h=1,r1=0,r2=0;
        for (i=mis+1;i<=mae;i++){
            if (f[i]==f[i-1]){
                if (f[i]) h++;
                else l++;
            }else{
                r1=max(r1,l);
                r2=max(r2,h);   
                if (f[i]){
                    l=0;h=1;
                }else{
                    l=1;h=0;
                }
            }
        }
        fout<<r2<<" "<<r1<<endl;
    }
    return 0;
}

按理来说应该是可以按照开始时间排序然后求解的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值