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;
}