More Related Content
More from Yuma Inoue (13)
Arc 010 b
- 4. 例1
Sample Input
1 日 月 火 水 木 金 土
1/9 1 2 3 4 5 6 7
8 9 10 11 12 13 14
Sample Output
3
1/7(土),1/8(日),1/9(月・祝)の3連休が最長である
- 5. 例2
Sample Input
1 日 月 火 水 木 金 土
1/10 1 2 3 4 5 6 7
8 9 10 11 12 13 14
Sample Output
2
1/7(土),1/8(日)などの二連休が最長である
- 6. 例3
Sample Input
1 日 月 火 水 木 金 土
1/7 1 2 3 4 5 6 7
8 9 10 11 12 13 14
Sample Output
3
1/7は土曜日のため、最も近い平日である1/9が振替休日となる
よって、1/7(土),1/8(日),1/9(月)の3連休が最長である
- 7. 例4
Sample Input
2 日 月 火 水 木 金 土
1/7 1 2 3 4 5 6 7
1/9 8 9 10 11 12 13 14
Sample Output
4
1/7は土曜日のため、最も近い平日である1/10が振替休日となる
1/9は祝日である
よって、1/7(土),1/8(日),1/9(月),1/10(火)の4連休が最長である
- 9. 想定解法
よくある日付問題と同じく、日をずらしていくタイムドリブン
12×31のbool配列に、休日かどうかをメモしていく
祝日チェックは12×31のbool配列などを別に作ると楽
一回目のループ
土日の場合は休日フラグtrue
土日でなく、かつ祝日なら休日フラグをtrueにしつつ祝日フラグfalse
土日でも祝日でもない場合は休日フラグfalse
二回目のループ
祝日フラグが立っているものについて、日を進めていって初めて休日
フラグがfalseのところをtrueにして、祝日フラグfalse
三回目のループ
trueが連続している数の最大値を求める
二回目のループで二重ループが入るので、O(366×n)くらい
- 10. 想定解法2
よく考えると、先に土日でない祝日を確定しておく必要はない
祝日になる予定の日が先に他の祝日の振替休日になっても、そのまま
振替休日を求めれば休日になる日は全体で変わらない
土 日 月 火
祝日A 祝日B
先に固定→ 祝日B 振替A 休日的には
貪欲決定→ 振替A 振替B 同じ
よって、貪欲に振替休日を求めてもよい(ループ1はいらない)
さらに、祝日残数カウンタ(syukuとおく)を作るとO(366)
現在の連休数をseqとおく
現在の日付が祝日ならsyuku++
その後、
現在の日付が土日なら、syukuはいじらずseq++
現在の日付が土日でない、かつsyuku>0なら、seq++,syuku—
現在の日付が土日でない、かつsyuku==0なら、ans = max(ans,seq), seq = 0
- 11. やらかすかもしれないところ
ちゃんと読まずに閏年で2/29があるのを忘れる
振替休日が上手くいかない
連続する土日の両方とも祝日の場合
振替休日が祝日の場合
“201 2年の連休数”なのに2013年に突入してしまう
数学的に理論値とかを出そうとすると起こりそう
境界条件ミス(12/31、366日でストップ)
12/31を過ぎる振替休日がある場合に連休に入れてしまう
1 2/31でループが終わった後にもans = max( ans,seq)しなければいけない
のを忘れる
祝日の日付が時系列順に与えられるとは限らないのを忘れる
祝日が0日のとき
“/”区切り処理に手間取る(Cならscanf(“%d/%d”,&m,&d)でOK)