USACO注文シミュレーションを搾乳搾乳牛

1005:1.2.1は搾乳牛を搾乳

制限時間:1秒   メモリ制限:128メガバイトの
提出:15   解決策:9
[ 提出 ]、[ 状態 ]、[ ディスカッションボード ] [命題男:外部のインポート]

タイトル説明

搾乳1.2.1搾乳牛    

(Milk2.pas / C / CPP) 

  三つの農家は、3頭の搾乳牛にブルペンに行き、毎日午前5時に起床します。1000秒まで、300秒で彼の搾乳牛に(午前5時00分開始時刻からの)最初の農民。700秒で第二の農民は1200秒で終わる、始まります。2100秒の終わりを開始1500秒で三農家。少なくとも一つの搾乳農家連続時間と最長の期間は、(300秒から1200秒まで)900秒であり、かつ(初めまで搾乳搾乳の終わりから)最長の連続無人搾乳時間300秒(1200秒から1500秒まで)。 

あなたの仕事は、(1 <= N <= 5000)Nで農家を読み込むプログラムをコンパイルすることであるN牛は以下の2点(両方秒)を算出し、労働時間のリストを混雑しました: 

  • 搾乳中に少なくとも1人の最長期間。
  • 最長期間無人搾乳。(搾乳誰かから実行を開始します



ファイル名:milk2 

入力: 

(ファイルmilk2.in) 

ライン1: 

整数N. 

ライン2..N + 1: 

1000000未満の二つの非負の整数の各ラインは、農家は、開始時刻と終了時刻を表します。 



出力: 

(ファイルmilk2.out) 

ライン、二つの整数は、それが必要な2つの答えの主題です。 



サンプル入力
3
300 1000年
700 1200
1500 2100
サンプル出力
900 300

 

プロンプト

 

ソース/分類

 

 

私の神は、この質問はとても難しいことです

N(<= 5000)の間隔があります。

0-1000000間のこれらのn個の間隔

psのは個人的には、単純なソート+アナログだと思います。

私は、シーケンス開始時間に応じてこれらの区間の最初の行が(高速放電が比較的簡単であることがnlogn)と思います

そう?0〜100 0000の最大実行時間からポインタを設定し、再度それは確かにタイムアウトああです。

 

 

それはとてもいっぱいOOOないようだ、OOO ~~~~

 

AOAO嘆きは、実際には1から1000000の間で理解するように見えた、無スイープに多くのポイントが残っています

そして限りないOKに再び前後から、このスイープ後にソートされたn個の間隔のn個の間隔のための出発点として、1から1000000時間から直接+5000アウト確かでない時にそれを掃き出し以来!(密かに言う:はい!神がた私は期待していなかった何を!)

 

どのようにするときのアナログスイープそれは?

うーむ...

私は一瞬考えた後、タイトルバーを見て

 

 

搾乳中に少なくとも1人の最長期間。

最長期間無人搾乳。(搾乳誰かから実行を開始します

 

 

限り、過去の行の次の列挙にリングのような何も拾うか、実際には重複がないかどうかを確認する間隔は、接続されているか否かであるときの最初の戦い

単純なポイントは、現在の間隔未満tmpendの開始がtmpend各間隔と電流が最大値伊達衆をとるかどうか決定されます

 

 

第二に。神はず。その場無知円

考えて停止し、停止し、再びO(∩_∩)O笑〜

現在の間隔がtmpendより大きい開始する場合

これは、接続と同等であり、他のブレンドインターバルの間で来たん保証することはできません

なぜ "

実際には、実際に格納された非常に単純なtmpendは最後端の値の後に現在の間隔の最大範囲までです

だから、最も後方〜現在のコースをtmpend tmpendに、間に他の間隔は、間隔の友達を列挙し始めるん

6666

それを試してノック

 AC了!

私のコードの変数名は理解することは非常に簡単かもしれO(∩_∩)O笑〜

 

 

非常に重要な問題でもあります

以后打擂台的时候假如要寻找最大值

初始的maxn一定要设成0 别设成-1 比如这一个题的最长的无人时间 可能每时每刻都有人啊  那你要是一开始的时候设得-1就输出了-1  其实应该是 0 !

下一次不要再犯错误了(~ ̄▽ ̄)~

#include<bits/stdc++.h>
using namespace std;
struct Node{
    int Begin,End;//结构体大法好 
}milk[5005];
int cmp(Node a,Node b){
    return a.Begin<b.Begin;//其实那个End不用考虑啊 
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&milk[i].Begin,&milk[i].End);
    sort(milk+1,milk+n+1,cmp);//sort排序一下 再加一个cmp
    int tmpend=milk[1].End   ,   max_at_least_1=milk[1].End-milk[1].Begin   ,   max_nobody=0;
    int at_least_1_tot=milk[1].End-milk[1].Begin;
    for(int i=2;i<=n;i++){
        if(milk[i].Begin<=tmpend){//区间相连
            if(milk[i].End>=tmpend)
                at_least_1_tot+=milk[i].End-tmpend;
            tmpend=max(tmpend,milk[i].End);
        }
        else{//有空隙 
            max_at_least_1=max(max_at_least_1,at_least_1_tot);//取最大值 
            at_least_1_tot=milk[i].End-milk[i].Begin;//还原重新累计 
            max_nobody=max(max_nobody,milk[i].Begin-tmpend);
            tmpend=max(tmpend,milk[i].End);
        }
    } 
    printf("%d %d", max_at_least_1 , max_nobody );
     
    return 0;
}

 

おすすめ

転載: www.cnblogs.com/Tidoblogs/p/11291670.html