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

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

AOJ81~90 - (2011/08/14 (日) 19:00:29) の編集履歴(バックアップ)


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





0086 Patrol

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0086
地点が連番で100番以下だと勝手に想定して解いたら実際に連番だったようだ。
単なる一筆書き。

<stdio.h>

bool solve(){
int map[104]={0},m1,m2;

while(1){
	if(scanf("%d %d",&m1,&m2)==EOF){
		return false;
	}
	if(m1==0 && m2==0){
		break;
	}
	map[m1]++;
	map[m2]++;
}
char *c="OK";
if(map[1]%2!=1 && map[2]%2!=1){
	c="NG";
}else{
	for(int i=3;i<104;i++){
		if(map[i]%2==1){
			c="NG";
			break;
		}
	}
}
printf("%s\n",c);
return true;
}


int main()
{
while(solve()){
}	
}