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

AOJ再挑戦61~65 - (2014/01/30 (木) 09:36:32) のソース

*問61 Rank Checker
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0061
整理番号とスコア。
スコアとランクを対応付けるだけです。
コードが冗長ですね、もうちょっと刈り取れそうです。
 #include<stdio.h>
 const int MAX=31;
 const int TMAX=101;
 int main(){
  	int ranks[MAX]={0},scores[TMAX],no,score;
 	while(1){
 		scanf("%d,",&no);
 		scanf("%d",&score);
 		if(no==0&&score==0)break;
 		scores[no]=score;
 		ranks[scores[no]]++;
  	}
 	int rank=0;
 	for(int i=MAX-1;i>=0;i--){
 		if(ranks[i]>0)rank++;
 		ranks[i]=rank;
 	}
 	while(scanf("%d",&no)!=EOF){
  		printf("%d\n",ranks[scores[no]]);
 	}	
 }



*問62 What is the Bottommost?
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0062
逆パスカルの三角形風味の問題。
解法
定義通り計算するだけ。
   1
  1 1
 1 2 1
 、、、、
で一発で求める式もあるけれどめんどくさいですね。
  
 #include<stdio.h>
 
 int main(){
 	char text[11];
 	while(scanf("%s",text)!=EOF){
   		for(int i=9;i>=1;i--){
 			for(int j=0;j<i;j++){
 				text[j]=((text[j]-'0')+(text[j+1]-'0'))%10+'0';
 			}
 		}
  		printf("%c\n",text[0]);
 	}
 }



*問63 Palindrome
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0063
文字列が回文になってるか判定して数える問題。

簡単な問題なので書くこと特になし。
まあstlのアルゴリズムもぼちぼち使えるようにならないとな。


 #include<stdio.h>
 #include<string>
 #include<algorithm>
 #include<iostream>
 
 int main(){
  	std::string str,strRev;
 	int ans=0;
 	while(std::cin>>str){
 		if(std::cin.eof())break;
 		strRev=str;
 		std::reverse(strRev.begin(),strRev.end());
 		ans+=(str==strRev);
  	}
 	printf("%d\n",ans);
 }


*問64 Secret Number
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0064

STLのアルゴリズムの勉強。
行き当たりばったりで勉強しているうえSTLのアルゴリズムには不慣れなのでたぶん玄人から見たら笑うレベルの使い方だとは思う。
精進しないとな。
我流でなくきちっとしたコードも書けるようになる勉強ってなんだろう?


 #include<stdio.h>
 #include<string>
 #include<iostream>
 #include<ctype.h>
 #include<algorithm>
 
 int string_sum(std::string& str, std::string& str2){
 	std::string::iterator it;
 	int result=0;
 	it = std::find_first_of(str.begin(), str.end(), str2.begin(), str2.end());
 	while(it != str.end()) {
  		it = std::find_first_of(it, str.end(), str2.begin(), str2.end());
 		int add=0;
 		while(it!=str.end() && isdigit(*it)){
 			add=add*10+((*it)-'0');
 			it++;
 		}
 		result+=add;
  	}
 	return result;
 }  
 
 int main(){
 	std::string str;
 	std::string v2="0123456789";
 	int ans=0;
 	while(std::getline(std::cin,str)){
 		ans+=string_sum(str,v2);
  	}
 	std::cout<<ans<<"\n";
 }




*問65 Trading
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0065
簡素な取引データから2か月連続で取引のあった会社と取引回数を出力する問題。
std::mapで集計するだけです。

 #include<stdio.h>
 #include<map>
 #include<stdlib.h>
 
 int main(){
 	std::map<int,int> old,now;
  	int no,day;
 	char re[10];
 	while(scanf("%d,%d%[\n]",&no,&day,re)!=EOF){
 		if(old.find(no)==old.end())old[no]=0;
 		old[no]++;
 		if(re[1]=='\n')break;
 	}
 	while(scanf("%d,%d",&no,&day)!=EOF){
 		if(old.find(no)!=old.end()){
  			if(now.find(no)==now.end())now[no]=old[no];
 			now[no]++;
 		}
 	}
 	for(std::map<int,int>::iterator it=now.begin();it!=now.end();it++){
  		printf("%d %d\n",(*it).first,(*it).second);
 	}
 }