您的位置:首页 > 编程语言 > C语言/C++

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

2017-05-30 16:32 351 查看
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;
}


按理来说应该是可以按照开始时间排序然后求解的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言