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

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

AOJ101~110 - (2011/08/16 (火) 10:28:14) の編集履歴(バックアップ)


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);
}
}



0109 Smart Calculator

式の構文解析やら供用体やらただ今ちょっと不慣れなことに挑戦中。
作りかけコード掲載。
うーん苦手なのでコードもかなり怪しい、、、、


#include<stdio.h>
#include<stack>
#include<queue>
#include<string.h>
#include<map>
std::map<char,int> symbolRank;
struct symbol{
union data{
	int num;
	char kigou;
}d;
int type;
};
void set(char *text){
int len=strlen(text),p=0;
std::queue<symbol> siki;
std::stack<char> kigous;
char t,t2;
int num,mod=1,nextTypeNum=1,nextTypeSymbol=0,typeNum=1,typeSymbol=0,u;
symbol s;
symbolRank['(']=0;
symbolRank['+']=1;
symbolRank['-']=1;
symbolRank['*']=2;
symbolRank['/']=2;


	while(text[p]!='='){
	t=text[p];
	if(t=='('){
		kigous.push(t);
		p++;
		mod=nextTypeNum;//次は数字
	}else if(t==')'){
		while(kigous.top()!='('){
			s.d.kigou=kigous.top();
			kigous.pop();
			s.type=typeSymbol;
			siki.push(s);
		}
		kigous.pop();
		mod=nextTypeSymbol;//次は記号
		p++;
	}else if(mod==nextTypeSymbol){
		if(kigous.empty()==true){
			kigous.push(t);
			mod=nextTypeNum;
			p++;
		}else{
			t2=kigous.top();
			if(symbolRank[t2]>=symbolRank[t]){
				kigous.pop();
				s.d.kigou=t2;
				s.type=typeSymbol;
				siki.push(s);
				kigous.push(t);
			}else{
				kigous.push(t);
			}
			mod=nextTypeNum;
			p++;
		}
	}else if(mod==nextTypeNum){
		if(t=='-'){
			u=-1;
			p++;
			t=text[p];
		}else{
			u=1;
		}
		num=0;
		while('0'<=t && t<='9'){
			num*=10;
			num+=(t-'0');
			p++;
			t=text[p];
		}
		s.d.num=num*u;
		s.type=typeNum;
		siki.push(s);
		mod=nextTypeSymbol;
	}
}
s.type=typeSymbol;
while(kigous.empty()==false){
	s.d.kigou=kigous.top();
	kigous.pop();
	siki.push(s);
}
   while(siki.empty()==false){
       s=siki.front();  
       if(s.type==typeSymbol){
           printf("%c ",s.d.kigou);
       }else{
           printf("%d ",s.d.num);
       }
       siki.pop();
   }
} 
int main(){
char text[101];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
	scanf("%s",text);
	set(text);
}
}