Volume 5 / 0538->0540
情報オリンピック 2009本選 解答
難しい……。データが大きくなるとダメダメ。
Problem 0538 : IOIOI / IOIOI
BM法でやると時間切れになる。愚直にカウントして解いた。
#include <iostream> using namespace std; int main(void) { int n, m, cnt, result, i, j; char ch = ' '; while( cin >> n, n!= 0 ){ cin >> m; cin.get(ch); result = 0; do { cin.get(ch); if( ch == 'I' ){ for( cnt=0; ; cnt++ ){ cin.get(ch); if( ch == '\n' ) break; if( ch == 'I' ){ cin.putback(ch); break; } cin.get(ch); if( ch != 'I' ) break; } result += ( cnt-n >= 0 ) ? 1 + cnt-n : 0; } } while( ch != '\n' ); cout << result << endl; } return 0; }
Problem 0539 : Pizza / ピザ
店の位置をソートするために、はじめはvectorじゃなくてsetを使っていたのだけど、それよりvectorで保存して後でソートしたほうが早いみたい。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(void) { int d, n, m, k, i, input, sum, a, b; vector<int> shops; vector<int>::iterator it; while( cin >> d, d != 0 ){ cin >> n; cin >> m; shops.clear(); for( i=0; i<n-1; i++ ){ cin >> input; shops.push_back(input); } sort( shops.begin(), shops.end() ); sum = 0; for( i=0; i<m; i++ ){ cin >> k; it = upper_bound( shops.begin(), shops.end(), k ); if( it != shops.end() ){ a = *it - k; } else { a = d - k; } if( it != shops.begin() ){ it--; b = k - *it; } else { b = k; } sum += min( a, b ); } cout << sum << endl; } return 0; }
Problem 0540 : Amidakuji / あみだくじ(未)
たぶん時間切れになるから未提出。
sort()を使って構造体の配列をソートするのは初めてだった。
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct BAR { int a, b; }; // 構造体のソート bool bar_cmp( const BAR &left, const BAR &right ){ if( left.b == right.b ) return left.a < right.a; return left.b < right.b; } int solve( int x, int k, vector<int> amida, vector<BAR> bars ) { int i; int tmp; for( i=bars.size()-1; i>=0; i-- ){ if( i != x ){ tmp = amida[bars[i].a-1]; amida[bars[i].a-1] = amida[bars[i].a]; amida[bars[i].a] = tmp; } } int sum = 0; for( i=0; i<k; i++ ) sum += amida[i]; return sum; } int main(void) { int n, m, h, k, i; vector<int> amida; vector<BAR> bars; while( cin >> n >> m >> h >> k, n != 0 ){ amida.resize(n); for( i=0; i<n; i++ ) cin >> amida[i]; bars.resize(m); for( i=0; i<m; i++ ) cin >> bars[i].a >> bars[i].b; sort( bars.begin(), bars.end(), bar_cmp ); int result = solve( -1, k, amida, bars ); int new_val; for( i=0; i<m; i++ ){ new_val = solve( i, k, amida, bars ); if( result > new_val ) result = new_val; } cout << result << endl; } return 0; }