読者です 読者をやめる 読者になる 読者になる

GCJ 2R & UAPC2011

プログラミングコンテスト

GCJ

GCJなんて無かった。超低速1完2000位くらい。悲しかった。

UAPC2011

UAPC2011なんて無かった。2完で60位くらい。悲しかった。

とまあ、UAPCは5時間掛けたのに結局解けたのが2問だったわけですよ。

Bが復活していたのに気づけなかったのが痛かった。一応コンテストではA,Kしか解いていませんが、コンテスト終了後に2問解けたので4つソースのせときます。

問題文: AIZU ONLINE JUDGE

A

midnightの条件をうっかり誤っていた人も多いんじゃなかろうか。

サンプルが巧妙すぎて泣いた。

A,B,K,Hだけ(GとDは解けそうで解けなかった)

string get(int a,int b){
	if(a+b == 0) return "no guest";
	else return itos((double)a/(a+b)*100);
}
int main(){
	int n;
	while(cin >> n && n){
		int a,b,c;
		int q[3]={0},r[3]={0};
		for(int i=0;i<n;i++){
			scanf("%d%*c%d%d",&a, &b, &c);
			int t = -1;
			
			if(b<c)t = c-b;
			else t = (c+60)-b;
			
			if(t <= 8) {
				if(a >= 11 && a < 15){
					q[0]++;
				}else if(a >= 18 && a < 21){
					q[1]++;
				}else if(a >= 21 || a < 2){
					q[2]++;
				}
			}else{
				if(a >= 11 && a < 15){
					r[0]++;
				}else if(a >= 18 && a < 21){
					r[1]++;
				}else if(a >= 21 || a < 2){
					r[2]++;
				}
			}
		}
		cout << "lunch" << " " << get(q[0],r[0]) << endl;
		cout << "dinner" << " " << get(q[1],r[1]) << endl;
		cout << "midnight" << " " << get(q[2],r[2]) << endl;
	}
}

B

スケジューリング?の貪欲法。

アニメの終了でソートして取っていく。蟻本に載っている。

ただ、今回はアニメの放送時間は全て30分で統一されているので、始点ソートしても同じ結果が得られる。

vector< pair<int,int> > data;
map<string,int> wtime;
int main(){
	int n;
	while(cin >> n && n){
		data.clear();
		wtime.clear();
		rep(i,n){
			string a;
			int b,c;
			cin >> a >> c >> b;
			b = (b/100) * 60 + (b%100);
			if(b >= 60*24)b -= 60*24 , c++;
			wtime[a] = c*60*24 + b;
		}
		vector<int> fav;
		vector<int> normal;
		int p;cin >> p;
		rep(i,p){
			string s;
			cin >> s;
			fav.push_back(wtime[s]);
			wtime.erase(s);
		}
		EACH(it,wtime){
			normal.push_back(it->second);
		}
		bool ok = true;
		int ans = 0;
		bool bad[20000]={0};
		rep(i,fav.size()){
			bool f = true;
			int s = fav[i];
			rep(j,30)if(bad[s+j])f = false; 
			rep(j,30)bad[s+j] = true;
			if(!f) ok = false;
			ans++;
		}
		rep(i,normal.size()){
			int s = normal[i];
			bool f = true;
			rep(j,30)if(bad[s+j])f = false; 
			if(f){
				ans++;
				rep(j,30)bad[s+j] = true;
			}
		}
		if(ok)cout << ans << endl;
		else cout << -1 << endl;
	}
}

H

WA出しまくっていて、数列だけど順番で与えられないってことに気づくのに1時間くらい掛かった。

そしてよく分からないWA地獄。コンテスト終了後long doubleとsqrt使ったソースに書き直したら通ってしまった。

int main(){
	int n,w,h;
	
	while(cin >> n , n){
		vector<ll> o,e;
		
		rep(i,n*(n+1)/2){
			ll a;
			cin >> a;
			if(a%2 == 1)o.push_back(a);
			else 		e.push_back(a);
		}
		sort(all(e));
		sort(all(o));
		ll v = sqrt( (long double)e[0] / o[0] * e[1] ) + 0.001; // 誤差対策
		cout << v << endl;
		rep(i,e.size()){
			cout << (i?" ":"") << e[i]/v;
		}
		cout << endl;
		
	}
}

K

まあ色々考え方はありますが、一筆書き(要するにひとつずつずらす)できればok出来なければダメ。なノリ。よって、WかHが偶数かどうか判定するだけで良い。

int main(){
	int w,h;
	while(cin >> w >> h && (w||h)){
		cout << (w%2 == 0 || h%2 == 0 ? "yes" : "no") << endl; 
	}
}