「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); } }
*問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); } }

表示オプション

横に並べて表示:
変化行の前後のみ表示: