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

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

AOJ81~90 - (2011/08/14 (日) 18:01:43) の1つ前との変更点

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

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

 *0081 A Symmetric Point
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0081
 教科書通りに線対称行列を書くだけ。
 
 
 #include<stdio.h>
 #include<math.h>
 
 int main(){
 	double xs[3],ys[3],vx,vy,x,y,len,sin1,cos1,sin2,cos2;
 	while(scanf("%lf,%lf,%lf,%lf,%lf,%lf",&xs[0],&ys[0],&xs[1],&ys[1],&xs[2],&ys[2])!=EOF){
 		vx=xs[1]-xs[0];
 		vy=ys[1]-ys[0];
 		len=sqrt(vx*vx+vy*vy);
 		sin1=vy/len;
 		cos1=vx/len;
 		sin2=2*sin1*cos1;
 		cos2=cos1*cos1-sin1*sin1;
 		vx=xs[2]-xs[0];
 		vy=ys[2]-ys[0];
 		x=vx*cos2+vy*sin2+xs[0];
 		y=vx*sin2-vy*cos2+ys[0];
 		printf("%lf %lf\n",x,y);
 	}
 }
 
 
 
 ----
 *0082 Flying Jenny
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0082
 ただただ原始的に回して乗れない人数の最小ポイントを求めるだけ。
 
 #include<stdio.h>
 #include<set>
 
 void calc(int m[8]){
 	int c[]={1,4,1,4,1,2,1,2},ans=2000000000,sum,ansNo=99999999,nowNo,t,p,ansPoint;
 	
 	for(int i=0;i<8;i++){
 		sum=nowNo=0;
 		for(int j=0;j<8;j++){
 			p=(i+j)%8;
 			nowNo*=10;
 			nowNo+=c[p];
 			t=m[j]-c[p];
 			sum+=t>0?t:0;
 		}
 		if(sum<ans || (sum==ans && ansNo>nowNo)){
 			ansNo=nowNo;
  			ans=sum;
 			ansPoint=i;
 		}
 	}
 	printf("%d",c[ansPoint]);
 	for(int i=1;i<8;i++) printf(" %d",c[(ansPoint+i)%8]);
 	printf("\n");
 }
 
 int main(){
 	int m[8];
 	while(1){
 		for(int i=0;i<8;i++){
 			if(scanf("%d",&m[i])==EOF) return 0;
 		}
 		calc(m);
 	}
 }
 
 
 
 *0083 Era Name Transformation
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0083
 月日はかわらないので年で分岐するだけ。
 
 
 #include<stdio.h>
 int main(){
 	int y,m,d,v;
 	char *s;
 	while(scanf("%d %d %d",&y,&m,&d)!=EOF){
 		v=y*10000+m*100+d;
 		if(v<18680908){
 			printf("pre-meiji\n");
 		}else if(v<19120730){
 			printf( "meiji %d %d %d\n",y-1867,m,d);
 		}else if(v<19261225){
 			printf("taisho %d %d %d\n",y-1911,m,d);
 		}else if(v<19890108){
 			printf( "showa %d %d %d\n",y-1925,m,d);
 		}else{
 			printf("heisei %d %d %d\n",y-1988,m,d);
 		}
 	}
 }
 
 
 *0084 Search Engine
 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0084
 ただ単に [, .] と単語を交互に読むだけ。
 
  #include<stdio.h>
  #include<string.h>
 
 int main(){
 	char word[1025],first=0,len;
 	while(scanf("%[^ .,]",word)!=EOF){
 		len=strlen(word);
 		if(2<len && len<7){
 			if(first==0){
 				first=1;
 			}else{
 				printf(" ");
 			}
 			printf("%s",word);
 		}
 		if(scanf("%[., ]",word)==EOF) break;
 	}
 	printf("\n");
+}
+
+
+
+
+----
+*0085 Joseph's Potato
+http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0085
+シミュレーション以外の解法を思いつかなかったので
+http://d.hatena.ne.jp/eha_s/20101201/1291129877を見てカンニング。
+原理は曖昧。
+
+
+#include<stdio.h>
+#include<string.h>
+int memo[1001];
+
+int f(int n,int k){
+	if(n==1) return 0;
+	if(memo[n]>-1) return memo[n];
+	memo[n]=(f(n-1,k)+k)%n;
+	return memo[n];
+}
+
+int main(){
+	int n,k;
+	scanf("%d %d",&n,&k);
+	while(n!=0 || k!=0){
+		memset(memo,-1,4004);
+		printf("%d\n",f(n,k)+1);
+		scanf("%d %d",&n,&k);
+	}
 }