問20 Capitalize
解法
一文字ずつ読み込んでtoupperで一発です。
一文字ずつ読み込む処理が少し遅かったようですがコードが膨らまないほうが嬉しいので気にしません。
#include<stdio.h>
#include <ctype.h>
int main(){
char c;
while(scanf("%c",&c)!=EOF){
printf("%c",toupper(c));
}
}
問21 Parallelism
解法
直線のなす角が平行=外積が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
解法
尺取虫法で簡単に解けます。
数字を一列に並べます。
ある列から集計を始める理由はその前とその値の集計の最大値よりでかい数字でないと始める理由がありません。
そして始める理由がない限りその手前までの集計に今の列を足したものがここまでの最大値となります。
そして途中で最大値になったものを更新して答えとします。
たったそれだけのことです。
#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
解法
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
解法
指定の数式そのままで計算します。
#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);
}
}
最終更新:2014年01月11日 09:54