「AOJ再挑戦31~35」の編集履歴(バックアップ)一覧に戻る

AOJ再挑戦31~35 - (2014/01/28 (火) 09:21:53) の編集履歴(バックアップ)


問31 Weight


解法
2^nで考えたらnのビットがたってるものだけ出力。
あとはn/2で割ったあとnが0でないならまだのせるものがあるのでスペースを出力。


#include<stdio.h>

int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		int a=1;
 		while(n!=0){
			if(n%2==1){
				printf("%d",a);
				n/=2;
				if(n>0)printf(" ");
 			}else{
				n/=2;
			}
			a*=2;
 		}
		printf("\n");
	}
}



問32 Plastic Board

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0032
長方形とひし形とそれ以外を判別して数える問題

解法

長方形なら3平方が成り立ち成り立たないなら、ひし形の可能性しかない。
ひし形なら隣り合う2辺は同じ長さ。
そうでないならひし形でもない。

#include<stdio.h>  
int main(){
 	int a,b,c,ans1=0,ans2=0;
	while(scanf("%d,%d,%d",&a,&b,&c)!=EOF){
		if(a*a+b*b==c*c){
			ans1++;
		}else if(a==b){
 			ans2++;
		}
	}	
	printf("%d\n%d\n",ans1,ans2);
}


問33 Ball

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0033
ボールを左右に分けていく問題。

解法
優先して左に入れる、入らなければ右に入らないか試す。
両方駄目ならどうやっても入らない。
それだけ、計算量は一回のボールセットで10。

#include<stdio.h> 
int main(){
	int n,l,r,b;
	scanf("%d",&n);
	while(n--){
 		l=r=0;//左のほうが常に大きくなるようにする入らなければ右
	bool ok=true;
 		for(int i=0;i<10;i++){
			scanf("%d",&b);
			if(l<b){
				l=b;
 			}else if(r<b){
				r=b;
			}else{
				ok=false;
 			}
		}
		printf("%s\n",ok?"YES":"NO");
	}
}



Railway Lines

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0034
電車がすれ違う区間をこたえる問題。
解法
両方の電車の相対速度で両社は違づくのでそれからすれ違うタイムが出てあとはすれ違うポイントを探すだけです。

#include<stdio.h>

int main(){
	double Ls[11],L,v1,v2;
 	while(1){
		Ls[0]=0;
		if(scanf("%lf,",&Ls[1])==EOF)break;
		for(int i=2;i<11;i++){
			scanf("%lf,",&L);
			Ls[i]=Ls[i-1]+L;
 		}
		scanf("%lf,%lf",&v1,&v2);
		double p=v1*Ls[10]/(v1+v2);
		int ans=0;
		for(int i=0;i<11;i++){
 			if(p<=Ls[i]){
				ans=i;
				break;
			}
		}
 		printf("%d\n",ans);
	}
}