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

AOJ81~90 - (2011/08/14 (日) 18:31:52) の編集履歴(バックアップ)


0081 A Symmetric Point

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0081
教科書通りに線対称行列を書くだけ。


<stdio.h>
<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
ただただ原始的に回して乗れない人数の最小ポイントを求めるだけ。

<stdio.h>
<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
月日はかわらないので年で分岐するだけ。


<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を見てカンニング。
原理は曖昧。
(,,,((k%2+k)%3+k)%4+,,,)+k)%n;
というのはどうも何人目を除くかということと関係があるらしいけど?


<stdio.h>
int f(int n,int k){
if(n==1) return 0;
return (f(n-1,k)+k)%n;
}

int main(){
int n,k;
scanf("%d %d",&n,&k);
while(n!=0 || k!=0){
	printf("%d\n",f(n,k)+1);
	scanf("%d %d",&n,&k);
}
}