[usaco]Milking Cows题解

题目:

输入一个n(<=5000)表示农夫数,接下去输入n行,每行两个分别表示开始和结束时间(小于一百万),计算从第一个人开始到最后一个人结束这段时间内,最长的至少有一人在挤奶的时间,和最长的没人挤奶的时间。例如输入3 300 1000 700 1200 1500 2100 则从300-1200中至少有一人在挤奶,而1200-1500中没有人在挤奶。故输出900 300

题解:

想到一个类似的路边种树的问题,于是就建立一个总的数组,初始为0,输入后把两个数之间的元素赋值为-1(为什么是-1,因为本来用的是Memset,只能是1和-1,但是总是有错,于是最后还是用了for循环,但是-1没改。)最后再整个数组(从第一个开始时间到最后一个结束时间)过一遍,仍然是分别计算最长连续相同子列长度。

代码:

/*
ID: xcwhkh1
LANG: C
TASK: milk2
*/
#include <stdio.h>
#include<string.h>
int a[1000000];
int main () {
FILE *fin  = fopen ("milk2.in", "r");
    FILE *fout = fopen ("milk2.out", "w");
int n,max1=0,max=0,min=0,mmax=0,mmin=0,min1=1000000,start,end;
fscanf(fin,"%d",&n);
for(int i=0;i<1000000;i++)
a[i]=0;
for(int i=0;i<n;i++)
{
fscanf(fin,"%d %d",&start,&end);
for(int i=start;i<end;i++)
a[i]=-1;
if(start<min1)
min1=start;
if(end>max1)
max1=end;//空为0,非空为-1 
}
for(int i=min1;i<max1;i++)
{
if(a[i]==0)
{
min=0;//啊本来是-1直接相加的所以用了min,但本质上都是最大值
max++;//碰到0就max++并清空min,碰到-1则反过来,每个字符结束后都更新一下最大值
}
if(a[i]==-1)
{
max=0;
min++;
}
if(max>mmax)
mmax=max;
if(mmin<min)
mmin=min;
}
fprintf(fout,"%d %d\n",mmin,mmax);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值