AOJ : 1006 - Boring Commercial
問題概要
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1006
テレビCMについての問題。
この問題では、途中でCMを見ることなく、連続でどれだけの時間、通常番組を見続けることができるかを答える問題。
開始時間 p から終了時間 q の間で答える。
テレビ局は n 局あり、入力ではそれぞれの局のCMの時間が与えられる。(番組の時間ではないから注意)
この問題の入力の時間は、上位2ケタが hour、下位2ケタが minute で表されているため、時間の計算には注意。
アルゴリズム
コマーシャルであるかないかを示す配列 t を作成。
t[i]が1の場合、i分の時点で、コマーシャルでないことを表す。
t[i]が0の場合、i分の時点で、コマーシャルであることを表す。
配列 t を0で初期化。
テレビ局に関係なく、コマーシャルでない時間1を配列 t に埋める。
配列 t を先頭から見て行って、一番長く1が続く時間を出力する。
プログラム
#include <iostream> #include <cstring> using namespace std; #define REP(i,n,m) for(int i=n;i<m;i++) #define rep(i,n) REP(i,0,n) int t[2400]; int toMin(int time){ return time / 100 * 60 + time % 100; } int main(void){ int n,p,q; while(cin>>n>>p>>q && (n||p||q)){ p = toMin(p); q = toMin(q); memset(t,0,sizeof(t)); rep(i,n){ int m; cin>>m; int before = p; rep(j,m){ int ts,te; cin>>ts>>te; ts = toMin(ts); te = toMin(te); if(before <= ts){ REP(k,before,ts) t[k] = 1; before = te; } } if(before <= q){ REP(j,before,q) t[j] = 1; } } int ans = 0; int count = 0; REP(i,p,q+1){ if(t[i]){ count++; } else{ ans = max(ans,count); count = 0; } } ans = max(ans,count); cout<<ans<<endl; } return 0; }