洛谷P1204 or SSL-1088 USACO 1.2 擠牛奶

題目描述

三個農民每天清晨5點起牀,然後去牛棚給3頭牛擠奶。第一個農民在300時刻(從5點開始計時,秒爲單位)給他的牛擠奶,一直到1000時刻。第二個農民在700時刻開始,在 1200時刻結束。第三個農民在1500時刻開始2100時刻結束。期間最長的至少有一個農民在擠奶的連續時間爲900秒(從300時刻到1200時刻),而最長的無人擠奶的連續時間(從擠奶開始一直到擠奶結束)爲300秒(從1200時刻到1500時刻)。
你的任務是編一個程序,讀入一個有N個農民(1 <= N <= 5000)擠N頭牛的工作時間列表,計算以下兩點(均以秒爲單位):
bullet 最長至少有一人在擠奶的時間段。
bullet 最長的無人擠奶的時間段。

輸入

Line 1:

一個整數N。

Lines 2…N+1:

每行兩個小於1000000的非負整數,表示一個農民的開始時刻與結束時刻。

輸出
一行,兩個整數,即題目所要求的兩個答案。

樣例輸入

3
300 1000
700 1200
1500 2100

樣例輸出

900 300

解題思路:這個題就是簡單的暴力求解,把在工作的時間標記爲1,然後不在工作的時間標記爲0,然後求出連續的1和0的個數。

程序代碼:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int jmj[1000000];
int main()
{
    int i,n,j,k,m,t,ans1,ans2,f1,f2;
    while(scanf("%d",&n)!=EOF)
    {
        int l=99999999;
        int r=-1;
        memset(jmj,0,sizeof(jmj));
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&k,&t);
            r=max(r,t);
            l=min(l,k);
            for(j=k;j<t;j++)
                    jmj[j]=1;
        }
        f1=0;
        int flag=1;
        ans1=ans2=0;//要初始化定義一下**加粗樣式**
        for(int i=l;i<r;i++) 
        {
            if(jmj[i]) 
            {
                f1++;
                ans1=max(ans1,f1);
                f2=0;
            }
            else
            {
                f2++;
                ans2=max(ans2,f2);
                f1=0;
            }
        }
        printf("%d %d\n",ans1,ans2);
    }
    return 0;   
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章