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

AOJ0111~120 - (2011/08/17 (水) 14:09:44) の編集履歴(バックアップ)


0111 Doctor's Memorable Codes

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0111
ひたすら対応表を作るのがめんどくさい問題。
変換表に何か規則があるらしく自動生成ができるようなのだけど?

#include<iostream>
#include<map>
#include<string>
using namespace std;
map<char,string> e;
map<string,char> d;
std::string noToCode(int no){
std::string ans="01234";
for(int i=0;i<5;i++){
	ans[4-i]=no%2+'0';
	no=no/2;
}
return ans;
}
void setMap(){
for(int i=0;i<26;i++){
	e['A'+i]=noToCode(i);
}
e[' '] = "11010"; 
e['.'] = "11011";
e[','] = "11100";
e['-'] = "11101";
e['\'']= "11110";
e['?'] = "11111";
 d["101"] = ' ';
 d["000000"] = '\'';
 d["000011"] = ','; 
 d["10010001"] = '-'; 
 d["010001"] = '.';
 d["000001"] = '?'; 
 d["100101"] = 'A'; 
 d["10011010"] = 'B'; 
 d["0101"] = 'C';
 d["0001"] = 'D'; 
 d["110"] = 'E'; 
 d["01001"] = 'F'; 
 d["10011011"] = 'G';
 d["010000"] = 'H'; 
 d["0111"] = 'I'; 
 d["10011000"] = 'J'; 
 d["0110"] = 'K';
 d["00100"] = 'L'; 
 d["10011001"] = 'M'; 
 d["10011110"] = 'N';
 d["00101"] = 'O';
 d["111"] = 'P'; 
 d["10011111"] = 'Q'; 
 d["1000"] = 'R'; 
 d["00110"] = 'S'; 
 d["00111"] = 'T'; 
 d["10011100"] = 'U';  
 d["10011101"] = 'V'; 
 d["000010"] = 'W'; 
 d["10010010"] = 'X'; 
 d["10010011"] = 'Y'; 
 d["10010000"] = 'Z'; 
}
int main(){
setMap();
string line,put1,ans;
int p,k,size;
while(getline(cin,line)){
	put1="";
	for(int i=0;i<line.size();i++){
		put1.append(e[line[i]]);
	}
	ans="";
	p=0;
	size=put1.size();
	while(p<size){
		for(int k=3;k<9;k++){
			if(p+k>size){
				 p=size;
				 break;
			}
			line=put1.substr(p,k);
			if(d.find(line)!=d.end()){
				ans+=d[line];
				p=p+k-1;
				break;
			}
		}
		p++;
	}
	cout<<ans<<"\n";
}
}





0112 A Milk Shop

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0112
long long intを使わないとintだとあふれるということにさえ注意すれば中学生でも解ける問題.
しかし新鮮ミルクじゃないよなもう。

#include <algorithm>
#include <iostream>
long long int t[10001];
void calc(int n){
   long long int ans=0;
   for(int i=0;i<n;i++){
       std::cin>>t[i];
   }
   std::sort(t,t+n);
   for(int i=0;i<n;i++){
       ans+=t[i]*(n-i-1);
   }
   std::cout<<ans<<"\n";
}
int main(){
   int n;
   while(1){
   scanf("%d",&n);
   if(n==0)break;
       calc(n);
   }
}







0113 Period

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0113
うーんなんだか分岐式が冗長になった気がする?

#include<stdio.h>
#include<map>
void calc(int p,int q){
std::map<int,int> memo;
int t,i=0;
   memo[p]=-1;
while(1){
	p*=10;
	t=(p/q)%10;
       p=p%q;
	if(p==0){
		printf("%d\n",t);
		return;
	}else if(memo.find(p)==memo.end()){
		printf("%d",t);
		memo[p]=i;
	}else{
		printf("%d\n",t);
		break;
	}
	i++;
}
   for(q=0;q<=i;q++){
           printf("%c",q<=memo[p]?' ':'^');
   }
   printf("\n");
}
int main(){
int p,q;
while(scanf("%d %d",&p,&q)!=EOF){
	calc(p,q);
}
}





0114 Electro-Fly

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0114
intだと桁あふれが起こるらしいので置き換えで全部long long intにしたら合格できた。


#include <iostream>
#include<stdio.h>
long long int gcd(long long int a, long long int b)
{
   long long int c;
   while (b != 0)
   {
       c = a % b;
       a = b;
       b = c;
   }
   return a;
}
long long int re(long long int x,long long int m){
long long int ans=1,t=x%m;
while(t!=1){
	t=(t*x)%m;
	ans++;
}
return ans;
}
int main(){
long long int a1,a2,a3,m1,m2,m3,t,n1,n2,n3,c;
while(1){
       std::cin>>a1>>m1>>a2>>m2>>a3>>m3;
	if(a1==0) break;
	n1=re(a1,m1);
	n2=re(a2,m2);
	n3=re(a3,m3);
	c=n1*(n2/gcd(n1,n2));
	c=c*(n3/gcd(n3,c));
       std::cout<<c<<"\n";
}
}