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

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

AOJ1~10 - (2011/08/16 (火) 12:16:01) のソース

----
*0001 List of Top 3 Hills
ソートするだけ
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0001&lang=jp


 #include<stdio.h>
 #include <algorithm>
 int main(){
	int m[10],i;
	for(i=0;i<10;i++){scanf("%d",&m[i]);}
	std::sort(m,m+10);
	for(int i=9;i>6;i--)printf("%d\n",m[i]);
 }


----
*0002 Digit Number
計算するだけ。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0002&lang=jp

 #include<stdio.h>
 int main(){
	int a,b,c,d=0;
	while(scanf("%d %d",&a,&b)!=EOF){
		c=a+b;
		d=0;
		while(c/10!=0){
			c/=10;
			d++;
		}
		printf("%d\n",d+1);
	}
 }



---- 
*0003 Is it a Right Triangle?
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0003&lang=jp
三角形の斜辺を求めるだけ。

 #include<stdio.h>
 int main(){
	int a,b,c,d;
	scanf("%d",&d);
	for(int i=0;i<d;i++){
		scanf("%d %d %d",&a,&b,&c);
		a*=a;
		b*=b;
		c*=c;
		if(a==b+c || b==c+a || c==b+a){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
 }




----
*0004 Simultaneous Equation
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0004&lang=jp
逆行列を書くだけ。

 #include<stdio.h>
 int main(){
	double a,b,c,d,e,f,x,y,k;
	while(scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&e,&f)!=EOF){
		k=a*e-b*d;
		x=(e*c-b*f)/k+0.0;
		y=(-d*c+a*f)/k+0.0;
		printf("%.3lf %.3lf\n",x,y);
	}
 }



----
*0005 GCD and LCM
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0005&lang=jp
教科書通りに求めるだけ。

 #include<stdio.h>
 int gcd(int a, int b)
 {
    int c;
    while (b > 0)
    {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
 }
 int main(){
	int a,b,q;
	while(scanf("%d %d",&a,&b)!=EOF){
		q=gcd(a,b);
		printf("%d %d\n",q,a*(b/q));
	}
 }



----
*0006 Reverse Sequence
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0006&lang=jp
逆から読むだけ。


 #include<stdio.h>
 #include<string.h>
 int main(){
	char t[21];
	scanf("%s",t);
	for(int i=strlen(t)-1;i>=0;i--){
		printf("%c",t[i]);
	}
	printf("\n");
 }





----
*0007 Debt Hell
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0007&lang=jp
計算するだけ

 #include<stdio.h>
 int main(){
	int d=100000,n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		d*=1.05;
		d+=d%1000==0?0:1000-d%1000;
	}
	printf("%d\n",d);
 }




----
*0008 Sum of 4 Integers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0008&lang=jp
メモ化で計算したけど探索範囲が狭いから全探索とたいして計算量違わない。
この問題に関しては上には上がいて恐ろしく小さい計算量で求めている人がいた。


 #include<stdio.h>
 #include<string.h>
 int main(){
	unsigned int m[5][52],p,q;
	memset(m,0,1040);
	m[0][0]=1;
	for(int k=0;k<51;k++){
		for(int i=0;i<40;i++){
			p=i/10;
			q=i%10;
			if(k+p>50) continue;
			m[p+1][k+q]+=m[p][k];
		}
	}
	while(scanf("%d",&p)!=EOF){
		printf("%d\n",m[4][p]);
	}
 }



----
*0009 Prime Number
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0009&lang=jp
下から数えていくだけ
この問題、Mapなんか使わず配列をそのまま使えば計算量もコード量も落ちることに気付いたのは提出した後だったりする。

 #include<stdio.h>
 #include<string.h>
 #include<map>
 std::map<int,int> s;
 int p;
 void setSo(){
	const m=1000003;
	bool t[m];
	p=1;
	memset(t,m,true);
	s[2]=p;
	for(int i=3;i<m;i+=2){
		if(t[m]==false) continue;
		p++;
		s[i]=p;
		for(int j=i*3;j<m;j+=i*2){
			t[j]=false;
		}
	}
 }
 int main(){
	setSo();
	int d;
	std::map<int,int>::iterator it;
	while(scanf("%d",&d)!=EOF){
		it=s.lower_bound(d);
		it=it!=s.begin()?it--:it;
		printf("%d\n",(*it).second);
	}
 }



----
*0010 Circumscribed Circle of a Triangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0010&lang=jp
外心の重心座標を求めるのはちょっとめんどくさい作業だな。
もっと簡単な式あるかも。
 
 #include<stdio.h>
 #include<math.h>
 double getDoubleSin(double x1,double y1,double x2,double y2){
	double len1,len2,s,c;
	len1=sqrt(x1*x1+y1*y1);
	len2=sqrt(x2*x2+y2*y2);
	s=fabs(x1*y2-y1*x2)/(len1*len2);
	c=(x1*x2+y1*y2)/(len1*len2);
	//printf("(%lf %lf)",s,c);
	return 2*s*c;
 }
 double getR(double a,double b,double c){
	double ans=a*b*c;
	ans/=sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c));
	return ans;
 }
 int main(){
	double xs[3],ys[3];
	double g1,g2,g3;
	double vx1,vy1,vx2,vy2;
	double g[3];
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%lf %lf %lf %lf %lf %lf",&xs[0],&ys[0],&xs[1],&ys[1],&xs[2],&ys[2]);
		double ansX=0,ansY=0,gSum=0;
		double lens[3];
		for(int i=0;i<3;i++){
			vx1=xs[(i+1)%3]-xs[i];
			vy1=ys[(i+1)%3]-ys[i];
			vx2=xs[(i+2)%3]-xs[i];
			vy2=ys[(i+2)%3]-ys[i];
			lens[i]=sqrt(vx1*vx1+vy1*vy1);
			g[i]=getDoubleSin(vx1,vy1,vx2,vy2);
			//printf("(2s=%lf)\n",g[i]);
			ansX+=g[i]*xs[i];
			ansY+=g[i]*ys[i];
			gSum+=g[i];
		}
		double R=getR(lens[0],lens[1],lens[2]);
		ansX/=gSum;
		ansY/=gSum;
		printf("%.3lf %.3lf %.3lf\n",ansX,ansY,R);
	}
 }