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

AOJ再挑戦問20~24 - (2014/01/11 (土) 09:54:11) のソース

*問20 Capitalize
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0020&lang=jp
与えられた英文の小文字を全て大文字に変えるだけの問題。

**解法
一文字ずつ読み込んでtoupperで一発です。
一文字ずつ読み込む処理が少し遅かったようですがコードが膨らまないほうが嬉しいので気にしません。

 #include<stdio.h>
 #include <ctype.h>
 int main(){
  	char c;
 	while(scanf("%c",&c)!=EOF){
 		printf("%c",toupper(c));
 	}
 }




*問21 Parallelism
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0021
2直線が平行かどうか判定する問題。

解法
直線のなす角が平行=外積が0になるです。
微妙な計算誤差対策をしてアセプト。

 #include<stdio.h>
 int main(){
 	double x1,x2,x3,x4,y1,y2,y3,y4,vx1,vy1,vx2,vy2,e;
 	double d=0.0000000001;
  	int n;
 	
 	scanf("%d",&n);
 	while(n--){
 		scanf("%lf %lf %lf %lf %lf %lf %lf %lf",
 			&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
  		vx1=x2-x1;
 		vy1=y2-y1;
 		vx2=x4-x3;
 		vy2=y4-y3;
 		e=vx1*vy2-vx2*vy1;
 		printf("%s\n",(-d<e && e<d)?"YES":"NO");
 	}
 }




*問22 Maximum Sum Sequence
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0022&lang=jp
数字列の中で連続し部分の和の最大値をこたえる問題。

解法
尺取虫法で簡単に解けます。
数字を一列に並べます。
ある列から集計を始める理由はその前とその値の集計の最大値よりでかい数字でないと始める理由がありません。
そして始める理由がない限りその手前までの集計に今の列を足したものがここまでの最大値となります。
そして途中で最大値になったものを更新して答えとします。
たったそれだけのことです。

 
 #include<stdio.h>
 
 int main(){
 	int n;
 	while(1){
 		scanf("%d",&n);
 		if(n==0)break;
 		
  		int sum,num,ans;
 		scanf("%d",&sum);
 		ans=sum;
 		for(int i=1;i<n;i++){
 			scanf("%d",&num);
  			if(sum+num<num)sum=num;
 			else sum+=num;
 			if(ans<sum)ans=sum;
 		}
 		printf("%d\n",ans);
 	}
 }




*問23 Circles Intersection
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0023&lang=jp
2円の位置関係を判断する問題。

解法
2、-2,0でなければ1だということを利用して判別しやすい2、-2、0だけ判別します。


 #include<stdio.h>
 #include<math.h>
 int main(){
 	int n;
  	scanf("%d",&n);
 	while(n--){
 		double xa,ya,ra,xb,yb,rb,len;
 		scanf("%lf %lf %lf %lf %lf %lf",&xa,&ya,&ra,&xb,&yb,&rb);
  		len=sqrt((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb));
 		int ans;
 		if(len>ra+rb){
 			ans=0;
 		}else if(len+rb<ra){
 			ans=2;
 		}else if(len+ra<rb){
 			ans=-2;
  		}else{
 			ans=1;
 		}
 		printf("%d\n",ans);
 	}
 }


*問24 Physical Experiments
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0024
物が割れる高さを求める問題。

解法
指定の数式そのままで計算します。

 #include<stdio.h>
 
 int main(){
 	double u,t,h;
  	int f;
 	while(scanf("%lf",&u)!=EOF){
 		t=u/9.8;
  		h=(4.9*t*t)/5;
 		f=(int)h+1;
 		if(h-(int)h>0)f++;
 		printf("%d\n",f);
 	}
 }