「AOJitp1」の編集履歴(バックアップ)一覧に戻る

AOJitp1 - (2014/01/13 (月) 13:41:59) のソース

競技プログラムになれるための例題問題集らしい。
中学生くらいから対象?
会津大学オンラインジャッジIntroduction to Programming I 解答例。

*Getting Started - X Cubic
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_1_B
xが一つ与えられるのでx^3を返せ。

 #include<stdio.h>
 int main(){
    int x;
    scanf("%d",&x);
    printf("%d\n",x*x*x);
     return 0;
 }

*Getting Started - Rectangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_1_C
縦Acm 横Bcmの長方形の周長と面積を求める問題。

 #include<stdio.h>
 int main(){
  	int a,b;
 	scanf("%d %d",&a,&b);
 	printf("%d %d\n",a*b,2*a+2*b);
 }


*Branch on Condition - Small, Large, or Equal
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_2_A
整数a bの大小関係をこたえる問題。

 #include<stdio.h> 
 int main(){
  	int a,b;
 	scanf("%d %d",&a,&b);
 	printf("a %s b\n",a<b?"<":a>b?">":"==");
 }



*Branch on Condition - Range
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_2_B
3つの数a,b,cがa<b<cを満たすならYesと返す問題。

 #include<stdio.h>
 int main(){
  	int a,b,c;
 	scanf("%d %d %d",&a,&b,&c);
 	printf("%s\n",a<b && b<c ? "Yes":"No");
 }


*Branch on Condition - Sorting Three Numbers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_2_C
3変数a,b,cをsortする問題。

 #include<stdio.h>
 int main(){
  	int a,b,c,t;
 	scanf("%d %d %d",&a,&b,&c);
 	if(a>b)t=a,a=b,b=t;
 	if(b>c)t=b,b=c,c=t;
 	if(a>b)t=a,a=b,b=t;
 	printf("%d %d %d\n",a,b,c);
 }


*Repetitive Processing - Print Many Hello World
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_3_A
1000個のHello Worldを出力する問題。

 #include<stdio.h>
 int main(){
 	for(int i=0;i<1000;i++){
 		printf("Hello World\n");
 	}
 }


*Repetitive Processing - Print Test Cases
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_3_B
複数入力ある問題に慣れるための練習問題。

 #include<stdio.h>
 int main(){
 	int i=1,n;
  	while(scanf("%d",&n)!=EOF){
 		if(n==0)break;
 		printf("Case %d: %d\n",i++,n);
 	}
 }


*Repetitive Processing - Swapping Two Numbers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_3_C
連続して2数の組が与えられるので2数を一行ずつ小さいほうを右に大きいほうを左に配置して出力せよ。

 #include<stdio.h>
 int main(){
  	int a,b,t;
 	while(scanf("%d %d",&a,&b)!=EOF){
 		if(a==0&&b==0)break;
 		if(a>b)t=a,a=b,b=t;
 		printf("%d %d\n",a,b);
 	}
 }



*Computation - A / B Problem
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_4_A
2数a,bが与えられるのでa//b a%b a/bをこたえよという問題。


 #include<stdio.h>
 int main(){
  	int a,b;
 	scanf("%d %d",&a,&b);
 	printf("%d %d %lf\n",a/b,a%b,(double)a/b);
 }



*Computation - Circle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_4_B
半径rの円の面積と円周を答えよ。

 #include<stdio.h>
 #include<math.h>
 int main(){
 	double r;
 	scanf("%lf",&r);
 	printf("%lf %lf\n",r*r*M_PI,2*r*M_PI);
 }



*Computation - Simple Calculator
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_4_C
単純な四則演算を処理する問題。

 #include<stdio.h>
 int main(){
 	int a,b,c;
  	char op;
 	while(scanf("%d %c %d",&a,&op,&b)!=EOF){
 		if(op=='?')break;
 		if(op=='+')c=a+b;
 		if(op=='-')c=a-b;
 		if(op=='*')c=a*b;
  		if(op=='/')c=a/b;
 		printf("%d\n",c);
 	}
 }


*Nested Controls I - Print a Rectangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_5_A
指定されたサイズの長方形を出力する問題。

 #include<stdio.h>
 int main(){
 	int a,b;
 	while(scanf("%d %d",&a,&b)!=EOF){
 		if(a==0&&b==0)break;
 		for(int i=0;i<a;i++){
 			for(int j=0;j<b;j++){
 				printf("#");
  			}
 			printf("\n");
 		}
 		printf("\n");
 	}
 }


*Nested Controls I - Print a Rectangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_5_A
枠付き長方形を出力する問題。

 #include<stdio.h>
 int main(){
 	int a,b;
 	while(scanf("%d %d",&a,&b)!=EOF){
  		if(a==0&&b==0)break;
 		for(int i=1;i<=a;i++){
			for(int j=1;j<=b;j++){
  				printf("%s",i==1 || i==a || j==1 || j==b?"#":".");
 			}
 			printf("\n");
 		}
 		printf("\n");
 	}
 }



*Nested Controls I - Print a Chessboard
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_5_C
チェック模様を出力する問題

 #include<stdio.h>
 int main(){
 	int a,b;
  	while(scanf("%d %d",&a,&b)!=EOF){
 		if(a==0&&b==0)break;
 		for(int i=0;i<a;i++){
 			for(int j=0;j<b;j++){
 				printf("%s",(i+j)%2?".":"#");
 			}
 			printf("\n");
 		}
 		printf("\n");
 	}
 }


*Nested Controls I - Print a Rectangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_5_A
数列を逆順に出力する問題

 #include<stdio.h>
 int main(){
 	int n,a[101],i;
  	scanf("%d",&n);
 	for(i=0;i<n;i++)scanf("%d",&a[i]);
 	for(i--;i>0;i--)printf("%d ",a[i]);
 	printf("%d\n",a[0]);
 }



*Array - Finding Missing Cards
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_6_B
足りないカードを出力する問題。

 #include<stdio.h>
 #include<string.h>
 
 int main(){
 	int cards[4][14],n,t,num;
 	char c,ws[5]="SHCD";
 	memset(cards,0,sizeof(cards));
 	scanf("%d",&n);
  	while(n--){
		scanf("%*c%c",&c);
  		scanf("%d",&num);
 		if(c=='S')t=0;
 		if(c=='H')t=1;
 		if(c=='C')t=2;
 		if(c=='D')t=3;
  		cards[t][num]=1;
 	}
  	for(int i=0;i<4;i++){
 		for(int j=1;j<=13;j++)if(cards[i][j]==0)printf("%c %d\n",ws[i],j);
 	}
 }







*Array - Official House
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_6_C
大学の公舎4棟の出入りを管理する問題。

 #include<stdio.h>
 #include<string.h>
 int main(){
 	int count[4][3][10],n,b,f,r,v;
 	memset(count,0,sizeof(count));
  	scanf("%d",&n);
 	while(n--){
 		scanf("%d %d %d %d",&b,&f,&r,&v);
 		count[b-1][f-1][r-1]+=v;
 	}
 	for(int i=0;i<4;i++){
 		for(int j=0;j<3;j++){
  			for(int k=0;k<9;k++)printf(" %d",count[i][j][k]);
 			printf(" %d\n",count[i][j][9]);
 		}
 		if(i!=3)printf("####################\n");
 	}
 }




*Nested Controls II - Grading
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_A
大学の試験結果の振り分けをする問題。
とりあえずショートコードで遊んでみたけれど一位の壁は厚い。


 #include<stdio.h>
 
 int main(){
 	int m,f,r,s,c;
 	while(scanf("%d%d%d",&m,&f,&r)){
  		if((m&f&r)==-1)break;
 		s=m+f;
 		c=4-(29<s)-(49<s)-(64<s)-(79<s);
  		c-=(c==3&&49<r);
 		if((m|f)==-1||s<30)c=5;
 		printf("%c\n",c+'A');
 	}
 }




*Nested Controls II - How many ways?
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_B
1からnまでの数を重複なく3個足してsを作るとき何通りの方法があるか答える問題。


 #include<stdio.h>
 int main(){
 	int n,s;
 	while(scanf("%d %d",&n,&s)!=EOF){
 		if(n==0&&s==0)break;
 		int ans=0;
  		for(int a=1;a<n && 3*a<=s;a++){
 			for(int b=a+1; b<n && a+2*b<=s;b++){
 				int c=s-a-b;
 				if(c<=b)break;
 				if(n<c)continue;
  				ans++;
 			}
 		}
 		printf("%d\n",ans);
 	}
 }





*Nested Controls II - Spreadsheet
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_C
表計算ソフトの足し算機能を題材にした問題。

 #include<stdio.h>
 #include<vector>
 int main(){
  	int r,c,n;
 	std::vector<int> colSum;
 	scanf("%d %d",&r,&c);
 	for(int i=0;i<c;i++)colSum.push_back(0);
 	while(r--){
 		int rowSum=0;
 		for(int j=0;j<c;j++){
  			scanf("%d",&n);
 			printf("%d ",n);
 			rowSum+=n;
 			colSum[j]+=n;
 		}
 		printf("%d\n",rowSum);
 	}
 	int rowSum=0;
 	for(int j=0;j<c;j++){
 		printf("%d ",colSum[j]);
 		rowSum+=colSum[j];
 	}
 	printf("%d\n",rowSum);
 }


*Character - Toggling Cases
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_8_A
英小文字を大文字に大文字を小文字に変えて出力する問題。

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



*Character - Sum of Numbers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_8_B
1000桁までの数字の各桁の和をこたえる問題。


 #include<stdio.h>
 #include<string.h>
 int main(){
 	char nums[1001];
 	while(scanf("%s",nums)!=EOF){
  		if(nums[0]=='0'&&nums[1]=='\0')break;
 		int ans=0;
 		for(int i=0;nums[i]!='\0';i++)ans+=(nums[i]-'0');
 		printf("%d\n",ans);
 	}
 }


*Character - Counting Characters
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_8_C
英語文章のアルファベット文字出現回数をこたえる問題。

 #include<stdio.h>
 #include<ctype.h>
 int main(){
 	int count[27]={0};
 	char c;
 	while(scanf("%c",&c)!=EOF){
  		c=tolower(c);
 		if(islower(c))count[c-'a']++;
 	}
 	for(char i=0;i<26;i++)printf("%c : %d\n",i+'a',count[(int)i]);
 }


*String - Finding a Word
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_9_A
文章中の単語出現回数を数える問題。
大文字小文字を区別しないに注意。

 #include<iostream>
 #include<string>
 #include<ctype.h>
 
 int main(){
 	int ans=0;
  	std::string str,word;
 	std::cin>>word;
 	for(int i=0;i<word.size();i++)word[i]=tolower(word[i]);
 	
 	while(1){
 		std::cin>>str;
 		if(str=="END_OF_TEXT")break;
 		for(int i=0;i<str.size();i++)str[i]=tolower(str[i]);
 		if(word==str)ans++;
 	}
 	std::cout<<ans<<"\n";
 }



*String - Shuffle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_9_B
文字列のシャッフルを題材にした問題

 #include<iostream>
 #include<string>
 int main(){
 	std::string str,strL,strR;
 	int n,s;
 	while(1){
 		std::cin>>str;
  		if(str=="-")break;
 		std::cin>>n;
 		while(n--){
 			std::cin>>s;
 			strL=str.substr(0,s);
  			strR=str.substr(s);
 			str=strR+strL;
 		}
 		std::cout<<str<<"\n";
 	}
 }





*String - Card Game
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_9_C
単純なカードゲームのスコアを計算する問題。

 #include<iostream>
 #include<string>
 int main(){
 	std::string strT,strH;
 	int scoreT=0,scoreH=0,n;
 	std::cin>>n;
 	while(n--){
  		std::cin>>strT>>strH;
 		int v=strT.compare(strH);
 		if(v==0){
 			scoreT+=1;
 			scoreH+=1;
  		}else if(v<0){
 			scoreH+=3;
 		}else{
 			scoreT+=3;
 		}
 	}
 	std::cout<<scoreT<<" "<<scoreH<<"\n";
 }






*Math - Distance
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_10_A
2点間の距離をこたえる問題。

 #include<stdio.h>
 #include<math.h>
 int main(){
  	double x1,y1,x2,y2,dx,dy;
 	scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
 	printf("%lf\n",hypot(x2-x1,y2-y1));
 }



*Math - Triangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_10_B
3角形の2辺の長さとなす角度から面積と周長と高さをこたえる問題。

 #include<stdio.h>
 #include<math.h>
 int main(){
 	double a,b,C,S,L,h;
  	scanf("%lf %lf %lf",&a,&b,&C);
 	C=C/180.0*M_PI;
 	h=b*sin(C);
  	S=0.5*a*h;
 	L=a+b+sqrt(a*a+b*b-2*a*b*cos(C));
 	printf("%lf\n%lf\n%lf\n",S,L,h);
 }


*Math - Standard Deviation
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_10_C
標準偏差を求める問題。
問題で指定されている計算方法は誤差が大きくなるしnで割るのも変な話だがまあ指定されているからしかたないか。


 #include<stdio.h>
 #include<math.h>
 int main(){
 	while(1){
  		double xs[1001],m=0,v=0;
 		int n;
 		scanf("%d",&n);
 		if(n==0)break;
  		for(int i=0;i<n;i++){
 			scanf("%lf",&xs[i]);
 			m+=xs[i];
 		}
 		m/=n;
 		for(int i=0;i<n;i++){
  			v+=(xs[i]-m)*(xs[i]-m);
 		}
 		printf("%lf\n",sqrt(v/n));
 	}
 }