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

aoj10000全部 - (2013/02/08 (金) 21:32:10) のソース

10000番台は競技プログラムの問題を初めて解く方のためのチュートリアル問題しかありません。
中学生プログラマでも解ける問題だけで構成されているのが特徴です。

*10000 Hello World
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10000
ヘローワールドを出力する問題。
 #include<stdio.h>
 int main(){
	printf("Hello World\n");
 }

*10001 X Cubic
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10001
x^3を表示する問題。

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


*10002 Rectangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10002
長方形の縦横と周計を表示する問題。

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


*10003 Small, Large, or Equal
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10003
大小関係を比べて表示する問題。


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


*10004 Sorting Three Numbers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10004
3つの数を小さい順に表示する問題。

 #include<stdio.h>
 #include <algorithm>
 int main(){
	int a[3];
	scanf("%d %d %d",&a[0],&a[1],&a[2]);
	std::sort(a,a+3);
	printf("%d %d %d\n",a[0],a[1],a[2]);
 }




*10005 Print Many Hello World
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10005
1000個のヘローワールドを表示する問題。

 #include<stdio.h>
 int main(){
	int n=1000;
	while(n--)printf("Hello World\n");
 }


*10006 Print Test Cases
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10006
複数のデータセットを読み込む法方の練習問題。 

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


*10007 Swapping Two Numbers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10007
2数を読み込んで小さい順に表示する問題。

 #include<stdio.h>
 int main(){
	int a,b,min,max;
	while(1){
		scanf("%d %d",&a,&b);
		if(a==0&&b==0)break;
		min=a>b?b:a;
		max=a>b?a:b;
		printf("%d %d\n",min,max);
	}
 }


*10008 A / B Problem
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10008
割り算と余りを表示する問題。
 
 #include<stdio.h>
 int main(){
	int a,b;
	scanf("%d %d",&a,&b);
	printf("%d %d %lf",a/b,a%b,(double)a/b);
 }



*10009  Circle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10009
円の面積と演習を出す問題。

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


*10010 Simple Calculator
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10010
四則演算を行う問題。



 #include<stdio.h>
 int main(){
	int a,b,c;
	char s[2];
	while(1){
		scanf("%d %s %d",&a,s,&b);
		switch(s[0]){
			case '+':
				c=a+b;
				break;
			case '-':
				c=a-b;
				break;
			case '*':
				c=a*b;
				break;
			case '/':
				c=a/b;
		}
		if(s[0]=='?')break;
		printf("%d\n",c);
	}
 }



*10011 Reversing Numbers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10011
数列を逆順に表示する問題。


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


*10012 Print a Rectangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10012
長方形を出力する問題。



 #include<stdio.h>
 int main(){
	int h,w;
	while(1){
		scanf("%d %d",&h,&w);
		if(h+w==0)break;
		while(h--){
			for(int x=0;x<w;x++){
				printf("#");
			}
			printf("\n");
		}
		printf("\n");
	}
 }


*100013 Print a Frame
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10013
枠付きの長方形を出力する問題。

 #include<stdio.h>
 int main(){
	int h,w;
	while(1){
		scanf("%d %d",&h,&w);
		if(h+w==0)break;
		for(int y=0;y<h;y++){
			for(int x=0;x<w;x++){
				printf("%s",y==0||y==h-1||x==0||x==w-1?"#":".");
			}
			printf("\n");
		}
		printf("\n");
	}
 }



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

 #include<stdio.h>
 int main(){
	int h,w;
	while(1){
		scanf("%d %d",&h,&w);
		if(h+w==0)break;
		for(int y=0;y<h;y++){
			for(int x=0;x<w;x++){
				printf("%s",(y+x)%2==0?"#":".");
			}
			printf("\n");
		}
		printf("\n");
	}
 }



*10015 Finding Missing Cards
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10015
トランプカードの情報から持ってないトランプのデータを出力する問題。

 #include<stdio.h>
 #include<string.h>
 int main(){
	bool card[4][13];
	memset(card,true,sizeof(card));
	int n,no;
	char t,s1[2];
	scanf("%d",&n);
	while(n--){
		scanf("%s %d",s1,&no);
		t=s1[0];
		if(t=='S')t=0;
		if(t=='H')t=1;
		if(t=='C')t=2;
		if(t=='D')t=3;
		card[t][no-1]=false;
	}
	char tToN[]={'S','H','C','D'};
	for(int i=0;i<4;i++){
		t=tToN[i];
		for(int j=0;j<13;j++){
			if(card[i][j])printf("%c %d\n",t,j+1);
		}
	}
 }



 
*10016 Grading
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10016
生徒の得点データから成績を決める問題。

 #include<stdio.h>
 int main(){
	int m,t,r,s;
	char re;
	while(1){
		scanf("%d %d %d",&m,&t,&r);
		if(m==-1&&t==-1&&r==-1)break;
		if(m==-1||t==-1){
			re='F';
		}else{
			s=m+t;
			if(s>=80){
				re='A';
			}else if(s>=65){
				re='B';
			}else if(s>=50){
				re='C';
			}else if(s>=30){
				if(r>=50){
					re='C';
				}else{
					re='D';
				}
			}else{
				re='F';
			}
		}
		printf("%c\n",re);
	}
 }




*10017 How many ways?
この問題は普通に解けばn^2の計算量ですが1~nまでのすべての数を使えることを考えれば、計算量nに落とすことが出来ます。

 #include<stdio.h>
 #include <algorithm>
 int main(){
	int n,x,ans,d;
	while(1){
		scanf("%d %d",&n,&x);
		if(n==0&&x==0)break;
		ans=0;
		for(int a=1;a<=n&&a<x-2;a++){
			d=x-a;
			d=std::min(std::min(a,d),n+1)-(d+2)/2;
			if(d>0)ans+=d;
		}
		printf("%d\n",ans);
	}
 }


*10018 Toggling Cases
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10018
アルファベットの文字列を大文字を小文字に小文字を大文字にして出力する問題。
ほんの少しだけショートコードで遊んでみる。

 #include<stdio.h>
 int main(){
	int t;
	while(1){
		t=getchar();
		putchar(t+('A'<=t&&t<='Z')*32-('a'<=t&&t<='z')*32);
		if(t=='\n')break;
	}
 }


*10019 Sum of Numbers
各桁の数値を足していく問題。
ショートコードは苦手なのであまりコードが短くならない。

 #include<stdio.h>
 int main(){
	int x,s;
	while((x=getchar()-'0')!=0){
		s=x;
		while((x=getchar())!='\n'){
			s+=x-'0';
		}
		printf("%d\n",s);
	}
 }


*10020 Counting Characters
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10020
アルファベットの出現数を数える問題。

 #include<stdio.h>
 #include<string.h>
 int main(){
	int a[26];
	char ch;
	memset(a,0,sizeof(a));
	while(scanf("%c",&ch)!=EOF){
		if('a'<=ch&&ch<='z')a[ch-'a']++;
		if('A'<=ch&&ch<='Z')a[ch-'A']++;
	}
	for(int i=0;i<26;i++)printf("%c : %d\n",i+'a',a[i]);
 }


*10021 Finding Minimum String
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10021
与えられた単語の中で、辞書式順序で先頭になるものを出力するプログラムを作成して下さい。

 #include<stdio.h>
 #include<string>
 #include<iostream>
 int main(){
	std::string w,r;
	int n;
	std::cin>>n>>w;
	while(--n){
		std::cin>>r;
		if(w>r)w=r;
	}
	std::cout<<w<<"\n";
 }


*10022 Finding a Word
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10022
与えられた文章の中に指定された単語がいくつあるか答える問題。

解法
小文字を大文字にするのにSTLを使います。
今日から私もC++コーダからSTLコーダにジョブチェンジ。
ミニゲームくらいは作ったことあるけどきちんとしたプログラムを作ったことはないのでまだまだ私はコーダー。

 #include<stdio.h>
 #include<string>
 #include<iostream>
 #include<algorithm>
 
 
 struct ToUpper {
     char operator()(char c) { return std::toupper(c); }
 };
 
 
 int main(){
 	std::string word,text;
  	std::cin>>word;
 	std::transform(word.begin(),word.end(), word.begin(),ToUpper());
 	int ans=0;
 	while(1){
 		std::cin>>text;
  		if(text=="END_OF_TEXT")break;
 		std::transform(text.begin(), text.end(), text.begin(),ToUpper());
 		if(text==word)ans++;
 	}
 	std::cout<<ans<<"\n";
 }




*10023 Shuffle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10023


解法
カードの山が100万枚とかになったら別のアルゴリズムが必要ですが、練習問題なのでそのまま実装します。

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





*10024 Distance
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10024
2点間の距離を求める問題。

解法
math.hのhypot関数を使います。

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



*10025
三角形の2辺の長さとなす角が与えられるのでその三角形の面積、周長aを底辺とした時の高さを答えよ。
解法
三角形の公式から求めます

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



*10026 Standard Deviation
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10026
標準偏差を計算せよという問題。

解法
提示された式をそのまま計算します。


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


*10027 Card Game
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10027
カードゲームの得点を求める問題。

解法
std::stringで比較します。
ショートコードくらいしかやることがありませんが私はショートコードは苦手です。


 #include<stdio.h>
 #include<string>
 #include<iostream> 
 
 int main(){
  	int n,a=0,b=0;
 	std::string t,h;
 	scanf("%d",&n);
 	while(n--){
 		std::cin>>t>>h;
 		t>h?a+=3:t<h?b+=3:a++&b++;
 	}
 	printf("%d %d\n",a,b);
 }




*10028 Sort I
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10028
数字列をソートして表示する問題

解法
std::sortで一発です。

 #include<stdio.h>
 #include<algorithm>
 
 int main(){
 	int n,a[1001];
 	scanf("%d",&n);
 	for(int i=0;i<n;i++)scanf("%d",&a[i]);
 	std::sort(a,a+n);
 	for(int i=0;i<n;i++)printf("%s%d",i==0?"":" ",a[i]);
  	printf("\n");
 }



*10029 Sort II
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10029
ソートするサイズが上がっただけです。

解法
領域が足らないので配列を外に出すくらいです。
0.00をたたき出している人たちはすごいですね。

 #include<stdio.h>
 #include<algorithm>
 
 int a[1000002];
 int main(){
 	int n;
 	scanf("%d",&n);
 	for(int i=0;i<n;i++)scanf("%d",&a[i]);
 	std::sort(a,a+n);
 	for(int i=0;i<n;i++)printf("%s%d",i==0?"":" ",a[i]);
 	printf("\n");
 }




*10030と10031 Search I
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10030
解法
std::setを使いました。
この問題をコードサイズ100byte以下で書いてる人たちは純粋にすごいですね。
どんなテクを使ったのか想像すらできません。

 #include<stdio.h>
 #include<set>
 int main(){
 	std::set<int> nums;
 	int n,q,ans=0,num;
 	scanf("%d",&n);
 	for(int i=0;i<n;i++){
 		scanf("%d",&num);
 		nums.insert(num);
  	}
 	scanf("%d",&q);
 	for(int i=0;i<q;i++){
 		scanf("%d",&num);
 		ans+=(nums.find(num)!=nums.end());
 	}
 	printf("%d\n",ans);
 }



*10032 Stacking Blocks I
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10032
スタックを使った練習問題。

解法
std::stackを使うだけです。

 #include<stdio.h>
 #include<stack>
 int main(){
 	std::stack<char> s;
 	char text[6],color[6];
 	while(1){
  		scanf("%s",text);
 		if(text[0]=='q')break;
 		if(text[1]=='o'){
 			printf("%c\n",s.top());
 			s.pop();
 		}
 		if(text[1]=='u'){
 			scanf("%s",color);
 			s.push(color[0]);
 		}
 	}
 }



*10033 Stacking Blocks II
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10033
スタックの山の数と命令が増えました。
解法
スタックの数を増やすだけです。

 #include<stdio.h>
 #include<stack>
 #include<string>
 #include<iostream>
 
 int main(){
 	std::stack<char> s[102];
 	std::string com,color;
 	char c,c2;
 	int no,no2;
 	
 	while(1){
  		std::cin>>com;
 		if(com=="quit")break;
 		if(com=="push"){
 			std::cin>>no>>color;
 			s[no].push(color[0]);
  		}else if(com=="pop"){
 			std::cin>>no;
 			c=s[no].top();
 			s[no].pop();
 			std::cout<<c<<"\n";
 		}else if(com=="move"){
 			std::cin>>no>>no2;
 			c =s[no].top();
  			s[no].pop();
 			s[no2].push(c);
 		}
 	}
 }