程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> usaco Milking Cows 報告

usaco Milking Cows 報告

編輯:C++入門知識

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

題解:設置一個數組,表示當前時間點,初始化為0,每次讀入起點終點,在起點處加一,終點減一,然後從開始遍歷,用sum來加每一個時間點的值,sum是0的時候表示沒有擠奶,sum大於0的時候表示在擠奶,然後就可以搞了
代碼:
[cpp]
/*
ID:     lishicao
PROG:   milk2
LANG:   C++
*/ 
#include <iostream> 
#include <fstream> 
#include <cstring> 
using namespace std ; 
 
int  vis[1000500] ; 
 
ifstream fin  ( "milk2.in"  ) ; 
ofstream fout ( "milk2.out" ) ; 
 
int  main() 

    int  N ; 
    int  start , end , Max = 0 , Min = 99999999 , milked = 0 , notmilked = 0 ; 
    memset( vis , 0 , sizeof( vis ) ) ; 
 
    fin >> N ; 
    while( N -- ) 
    { 
        fin >> start >> end ; 
        if( end > Max ) Max = end ; 
        if( start < Min ) Min = start ; 
        vis[start] ++ ; 
        vis[end] --   ; 
    } 
 
    int  sum = 0 ; 
    int  Count = 0 ; 
    int  flag = 0 ; 
 
    for( int i = Min ; i <= Max ; i ++ ) 
    { 
        sum += vis[i] ; 
        if( flag == 0 ){ 
            if( sum == 0 ) { 
                flag = 1 ; 
                if( milked < Count ) milked = Count ; 
                Count = 0 ; 
            } 
            Count ++ ; 
        }  www.2cto.com
        else{ 
            if( sum > 0 ) { 
                flag = 0 ; 
                if( notmilked < Count ) notmilked = Count ; 
                Count = 0 ; 
            } 
            Count ++ ; 
        } 
    } 
    fout << milked << " " << notmilked << endl ; 
    return 0 ; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved