※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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

AOJ101~110 - (2011/08/16 (火) 05:26:54) の1つ前との変更点

追加された行は青色になります

削除された行は赤色になります。

 *101 Aizu PR
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0101&lang=jp
 基本機能を理解しているかを問われるだけ。
 
  #include<iostream>
  #include<string>
  int main(){
 	std::string s;
 	int n;
 	char c;
 	unsigned int pos;
 	
 	std::cin>>n;
 	std::getline(std::cin,s);
 	for(int i=0;i<n;i++){
 		std::getline(std::cin,s);
 		pos=0;
 		while(1){
 			pos=s.find("Hoshino",pos);
 			if(pos==std::string::npos) break;
 			s.replace(pos,7,"Hoshina");
 		}
 		std::cout<<s<<"\n";
 	}
  }
 
 
 
 
 
 
 
 ----
 *0102 Matrix-like Computation
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0102&lang=jp
 うーん?もうちょっと短くならないかなこれ?
 
  #include<stdio.h>
  void setMap(int n){
 	int tate[11]={0},yoko=0,p,sum=0;
 	for(int i=0;i<n*n;i++){
 		scanf("%d",&p);
 		yoko+=p;
 		tate[i%n]+=p;
 		sum+=p;
 		printf("%5d",p);
 		if(i%n==n-1){
 			printf("%5d\n",yoko);
 			yoko=0;
 		}
 	}
 	for(int i=0;i<n;i++){
 		printf("%5d",tate[i]);
 	}
 	printf("%5d\n",sum);
  }
  int main(){
 	int n;
 	while(1){
 		scanf("%d",&n);
 		if(n==0)break;
 		setMap(n);
 	}
  }
 
 
 
 
 ----
 *0103 Baseball Simulation
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0103
 書いてある通りに実装するだけ。
 
  #include<iostream>
  #include<string>
  void sym(){
 	std::string eve;
 	int out=0,score=0,b[3]={0};
 	while(out<3){
 		std::cin>>eve;
 		if(eve=="HIT"){
 			score+=b[2];
 			b[2]=b[1];
 			b[1]=b[0];
 			b[0]=1;
 		}else if(eve=="HOMERUN"){
 			score+=b[2]+b[1]+b[0]+1;
 			b[2]=b[1]=b[0]=0;
 		}else if(eve=="OUT"){
 			out++;
 		}
 	}
 	std::cout<<score<<"\n";
  }
  int main(){
 	int n,tern=0;
 	std::cin>>n;
 	while(tern<n){
 		sym();
 		tern++;
 	}
  }
 
 
 
 
 ----
 *0104 Magical Tiles
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0104&lang=jp
 書いてあるとおりに実装するだけ、外に出ないのでエラー処理がいらないのが楽。
 
  #include<stdio.h>
  void setMap(int h){
 	char map[101][101],t;
 	for(int i=0;i<h;i++){
 		scanf("%s",map[i]);
 	}
 	int x=0,y=0;
 	while(map[y][x]!='.' && map[y][x]!=0){
 		t=map[y][x];
 		map[y][x]=0;
 		if(t=='>'){
 			x++;
 		}else if(t=='v'){
 			y++;
 		}else if(t=='<'){
 			x--;
 		}else if(t=='^'){
 			y--;
 		}
 	}
 	if(map[y][x]==0){
 		printf("LOOP\n");
 	}else{
 		printf("%d %d\n",x,y);
 	}
  }
  int main(){
 	int w,h;
 	while(1){
 		scanf("%d %d",&h,&w);
 		if(w==0 && h==0) break;
 		setMap(h);
 	}
  }
 
 
 
 
 
 
 ----
 *0105 Book Index
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0105&lang=jp
 c++のstdやjavaのクラスを基本レベルで使えるかどうかを問うだけの問題。
 コードを短くしたり短縮テクニックを使ったりせず読みやすいコード重視で書いてみた。
 
  #include<string>
  #include<map>
  #include<set>
  int main(){
 	std::map<std::string,std::set<int> > index;
 	std::set<int> dSet;
 	char word[31];
 	int page;
 	while(scanf("%s %d",word,&page)!=EOF){
         if(index.find(word)==index.end()){
             index[word]=dSet; 
         }
         index[word].insert(page);
     }
     std::map<std::string,std::set<int> >::iterator it=index.begin();
     std::set<int>::iterator itPage;
     int f;
     
     while(it!=index.end()){
         printf("%s\n",(*it).first.c_str ());
         itPage=(*it).second.begin();
         f=0;
         while(itPage!=(*it).second.end()){
             printf("%s%d",f==0?"":" ",(*itPage));
             f=f==0?1:f;
             itPage++;
         }
         printf("\n");
         it++;
     }
  }
 
 
 
 
 ----
 *0106 Discounts of Buckwheat
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0106&lang=jp
 ナップザック法でいけるような気もしたけど、特殊な場合を見落とす可能性を排除できてるか自信が持てなかったのでhttp://d.hatena.ne.jp/kyuridenamida/20100810/1281440693をみてカンニング。
 リンク先は自分で考えたのと同じ方法だったのでちょっと嬉しかった。
 でも自信が持てずに他人のをマルコピしたのだからカンニングしたことに変わりはない。
 100の倍数であることを見落としているリンク先を少しだけ高速化。
 
  #include<stdio.h>
  #include <algorithm>
  int main(){
 	int max=1<<30;
 	int memo[51];
 	int ws[6]={2,3,5,10,12,15};
 	int ps[6]={380,550,850,1520,1870,2244};
 	for(int i=0;i<51;i++) memo[i]=max;
 	memo[0]=0;
 
 	for(int i=0;i<51;i++){
 		for(int j=0;j<6;j++){
 			if(i+ws[j]>50) break;
 			memo[i+ws[j]]=std::min(memo[i+ws[j]],memo[i]+ps[j]);
 		}
 	}
 	
 	int n;
 	while(1){
 		scanf("%d",&n);
 		if(n==0) break;
 		printf("%d\n",memo[n/100]);
 	}
  }
 
 
 
 ----
 *0107 Carry a Cheese
 直方体は辺と平行に入れるということに気づけば簡単。
 t=a*a+b*b+c*c-t*t;はちょっと嬉しいコード。
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0107&lang=jp
 
 
  #include <stdio.h>
  #include <algorithm>
  int main(){
 	int a,b,c;
 	int t,n,r;
 	
 	scanf("%d %d %d",&a,&b,&c);
 	while(a!=0 || b!=0 || c!=0){
 		t=std::max(std::max(a,b),c);
 		t=a*a+b*b+c*c-t*t;
 		scanf("%d",&n);
 		for(int i=0;i<n;i++){
 			scanf("%d",&r);
 			if(t<r*r*4){
 				printf("OK\n");
 			}else{
 				printf("NA\n");
 			}
 		}
 		scanf("%d %d %d",&a,&b,&c);
+	}
+ }
+
+
+
+----
+*0108 Operation of Frequency of Appearance
+http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0108&lang=jp
+愚直に実装、トリッキーな実装を思いつかなかったり。
+n=100000とかnが大きくなったらどう実装しようかな。
+
+
+ #include<stdio.h>
+ #include<map>
+ void calc(int m[13],int n){
+	std::map<int,int> memo;
+	int ans,count=0;
+	bool goal=false;
+	while(goal==false){
+		memo.clear();
+		goal=true;
+		for(int i=0;i<n;i++){
+			if(memo.find(m[i])==memo.end()){
+				memo[m[i]]=1;
+			}else{
+				memo[m[i]]++;
+			}
+		}
+		for(int i=0;i<n;i++){
+			if(m[i]!=memo[m[i]]){
+				goal=false;
+			}
+			m[i]=memo[m[i]];
+		}
+		count++;
+	}
+	printf("%d\n%d",count-1,m[0]);
+	for(int i=1;i<n;i++){
+		printf(" %d",m[i]);
+	}
+	printf("\n");
+ }
+ int main(){
+	int n,m[13];
+	while(1){
+		scanf("%d",&n);
+		if(n==0) break;
+		for(int i=0;i<n;i++) scanf("%d",&m[i]);
+		calc(m,n);
 	}
  }