AOJ Volume 0 (0000-0019)
はい。
http://judge.u-aizu.ac.jp/onlinejudge/finder.jsp?volumeNo=0
0000: QQ
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int mod=1000000007; int n,m; for (int i=1;i<10;i++) { for (int j=1;j<10;j++) { printf("%dx%d=%d\n",i,j,i*j); } } return 0; }
掛け算九九の出力をする。特に注意することや工夫できることは無いと思う。
0001: List of Top 3 Hills
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int mod=1000000007; int n,m; vector<int> l(10); for(auto&e:l) { scanf("%d",&e); } sort(l.begin(),l.end()); for(int i=9;i>6;i--) { printf("%d\n",l[i]); } return 0; }
sort(s.begin(),s.end(),greater<int>());
で降順でソート出来るらしい。 降順ソートがなくても山の数は10個であることがわかっているので、昇順ソートしたものから9,8,7番目を出力しても大丈夫だと思う。
0002: Digit Number
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int mod=1000000007; int a,b; while (scanf("%d %d",&a,&b)!=EOF) { int tmp=a+b,ans=1; while (tmp>=10) { tmp/=10; ans++; } printf("%d\n",ans); } return 0; }
いつ終わるかわからない複数行の受取は while(scanf("%d %d",&a,&b)!=EOF)
を使う。
string型にキャスト string s=to_string(a+b);
文字列長を見る方法と、1桁の数になるまで10で割り続けるなどがあると思う。
0003: Is it a Right Triangle?
C++11
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int mod=1000000007; int n; scanf("%d",&n); for (int i=0;i<n;i++) { vector<int> l(3); for (auto&e:l) { scanf("%d",&e); } sort(l.begin(),l.end()); printf((l[0]*l[0]+l[1]*l[1]==l[2]*l[2])?"YES\n":"NO\n"); } return 0; }
3辺の長さを受け取ってソートして、a2+b2=c2の関係になっているかを見れば直角三角形であるかの判定が出来る。
0004: Simultaneous Equation
C++11
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ double a,b,c,d,e,f; while(scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&e,&f)!=EOF){ double x=(c*e-b*f)/(a*e-b*d); double y=(c-a*x)/b; if(abs(x)<1e-10){ x=0; } if(abs(y)<1e-10){ y=0; } printf("%.3f %.3f\n",x,y); } return 0; }
クラメルの公式がすごい。
0005: GCD and LCM
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; //typedef int kz; //typedef long kz; typedef long long kz; kz gcd(kz a,kz b) { if(b==0) return a; else gcd(b,a%b); } kz lcm(kz a,kz b) { return a*b/gcd(a,b); } int main(){ int mod=1000000007; int a,b; while ((scanf("%d %d",&a,&b))!=EOF) { printf("%d %d\n",gcd(max(a,b),min(a,b)),lcm(max(a,b),min(a,b))); } return 0; }
最大公約数と最小公倍数。
0006: Reverse Sequence
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; //typedef int kz; //typedef long kz; typedef long long kz; kz gcd(kz a,kz b) { if(b==0) return a; else gcd(b,a%b); } kz lcm(kz a,kz b) { return a*b/gcd(a,b); } int main(){ int mod=1000000007; int n,m; string c; cin>>c; reverse(c.begin(),c.end()); cout<<c<<endl; return 0; }
stringだとreverseで楽に出来る。char型でやろうとするならstrlen()-1して末尾から1文字ずつ出力とかだと思う。
0007: Debt Hell
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int n,debt=100000; scanf("%d",&n); for (int i=0;i<n;i++) { debt=debt+(debt/20); if (debt%1000>0) debt=debt/1000*1000+1000; } printf("%d\n",debt); return 0; }
5%の利子の加算と1000円未満端数があったら繰上げをする。
0008: Sum of 4 Integers
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int n; while(scanf("%d",&n)!=EOF){ int ans=0; for (int i=0;i<10;i++) { for (int j=0;j<10;j++) { for (int k=0;k<10;k++) { for (int l=0;l<10;l++) { if (i+j+k+l==n) ans++; } } } } printf("%d\n",ans); } return 0; }
4重ループで総当りするしかないと思う。
0009: Prime Number
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<set> #include<stack> #include<queue> #include<algorithm> using namespace std; bool pr(int n) { int i=2; while (i*i<=n) { if (n%i==0) return false; i++; } return true; } int main(){ bool b[1000000]={0}; for (int i=0;i<1000000;i++) { b[i]=pr(i); } int n; b[0]=0,b[1]=0; while(scanf("%d",&n)!=EOF){ int ans=0; for (int i=1;i<=n;i++){ if (b[i]==true) ans++; } printf("%d\n",ans); } return 0; }
素数の配列を用意して入力のnに合わせて個数を数えた。素数の配列を作ってから個数を数えておいた配列を作っても良かったかもしれない。
0010: Circumscribed Circle of a Triangle
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> #include<complex> #include<cmath> using namespace std; #define PI 3.1415926535898 //点座標を型とする typedef complex<double> P; //許容誤差 #define EPS (1e-10) //X Y座標 #define X real() #define Y imag() class Triangle { private: //三角形の3点の座標 P a,b,c; //三角形の辺の長さ double edgeA, edgeB, edgeC; //三角形の角の大きさ double angleA, angleB, angleC; //余弦定理から3つの角度を求める double LawOfCosines(double a, double b, double c) { return acos((b*b+c*c-a*a)/(2.0*b*c)); } //2つのdouble型が等しいか bool equal(double a,double b) { return (abs(a-b)<EPS)?true:false; } public: //コンストラクタ Triangle(P p1, P p2, P p3) { a=p1; b=p2; c=p3; edgeB=abs(c-a); edgeA=abs(b-c); edgeC=abs(a-b); angleA=LawOfCosines(edgeA, edgeB, edgeC); angleB=LawOfCosines(edgeB, edgeC, edgeA); angleC=LawOfCosines(edgeC, edgeA, edgeB); } double circumscribedCircleRadius() {//外接円の半径 return (edgeA/sin(angleA)/2.0); } double circumscribedCircleX() {//外接円の中心X座標 double A=sin(2.0*angleA); double B=sin(2.0*angleB); double C=sin(2.0*angleC); return ((a.X * A + b.X * B + c.X * C)/(A+B+C)); } double circumscribedCircleY() {//外接円の中心Y座標 double A=sin(2.0*angleA); double B=sin(2.0*angleB); double C=sin(2.0*angleC); return ((a.Y * A + b.Y * B + c.Y * C)/(A+B+C)); } }; int main(){ int mod=1000000007; int n; double x1,y1,x2,y2,x3,y3; double r,xp,yp; scanf("%d",&n); for (int i=0;i<n;i++) { scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3); P a(x1,y1); P b(x2,y2); P c(x3,y3); Triangle Tr(a,b,c); xp=Tr.circumscribedCircleX(); yp=Tr.circumscribedCircleY(); r =Tr.circumscribedCircleRadius(); //printf("%.10f %.10f %.10f\n",xp,yp,r); printf("%.3f %.3f %.3f\n",xp,yp,r); } return 0; }
図形はさっぱりわからないのでhttp://d.hatena.ne.jp/otaks/20100929/1285719917から写経した。
0011: Drawing Lots
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; //typedef int kz; //typedef long kz; typedef long long kz; kz gcd(kz a,kz b) { if(b==0) return a; else gcd(b,a%b); } kz lcm(kz a,kz b) { return a*b/gcd(a,b); } int main(){ int mod=1000000007; int n,w; scanf("%d",&w); scanf("%d",&n); int x[w]; int r[n][2]; int ans[w]; for (int i=0;i<n;i++) { scanf("%d,%d",&r[i][0],&r[i][1]); } for (int i=1;i<=w;i++) { int tmp=i; for (int j=0;j<n;j++) { if (tmp==r[j][0]) tmp=r[j][1]; else if (tmp==r[j][1]) tmp=r[j][0]; } ans[tmp-1]=i; } for (int i=0;i<w;i++) { printf("%d\n",ans[i]); } return 0; }
移動の横線が2,4なのを2にいる時に4に移動する、4にいる時に2に移動するのを漏れないようにすれば大丈夫だと思う。
0012: A Point in a Triangle
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ double x1,y1,x2,y2,x3,y3,xp,yp; while(scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3,&xp,&yp)!=EOF){ if(((x2-x1)*(y2-yp)-(y2-y1)*(x2-xp)>0)&&((x3-x2)*(y3-yp)-(y3-y2)*(x3-xp)>0)&&((x1-x3)*(y1-yp)-(y1-y3)*(x1-xp)>0)){ printf("YES\n"); }else if(((x2-x1)*(y2-yp)-(y2-y1)*(x2-xp)<0)&&((x3-x2)*(y3-yp)-(y3-y2)*(x3-xp)<0)&&((x1-x3)*(y1-yp)-(y1-y3)*(x1-xp)<0)){ printf("YES\n"); }else{ printf("NO\n"); } } return 0; }
なんでコレで解いたのか or どこから写経してきたのか覚えてない。
0013: Switching Railroad Cars
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main() { int n; stack<int> l; while (scanf("%d",&n)!=EOF) { if (n==0) { printf("%d\n",l.top()); l.pop(); } else { l.push(n); } } return 0; }
stack以外にlist使ったりしても大丈夫だと思う。
0014: Integral
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int d; while(scanf("%d",&d)!=EOF){ int ans=0; for (int i=1;i<600/d;i++) { ans+=(d*i)*(d*i)*d; } printf("%d\n",ans); } return 0; }
いまのxの位置をdずつずらして縦が今のx2で横がdの四角形の面積を加算し続けると解になると思う。
0015: National Budget
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int t; scanf("%d",&t); while(t--){ //文字列扱いで受け取る char c1[1000],c2[1000]; scanf("%s",&c1); scanf("%s",&c2); string s1,s2; s1=c1, s2=c2; if(s1=="0" && s2=="0"){ printf("0\n"); continue; } //反転させて0埋めで桁数を合わせる reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); int n=max(s1.size(),s2.size())+1; for(int i=s1.size();i<n;i++){ s1+='0'; } for(int i=s2.size();i<n;i++){ s2+='0'; } string res; //bは繰上げがあるときの対策用 int b=0; for(int i=0;i<max(s1.size(),s2.size());i++){ int u=s1[i]-'0'+s2[i]-'0'+b; b=(u>=10); u%=10; res+=u+'0'; } reverse(res.begin(),res.end()); string res2; //先頭部分側の0は使わない、0以外の数字が出たとこから答え用文字列に付け足す int j=0; while(res[j]=='0') j++; for(;j<res.size();j++){ res2+=res[j]; } if(res2.size()>80){ printf("overflow\n"); }else{ printf("%s\n",res2.c_str()); } } return 0; }
どこかから写経したものを推定でコメントを追加。
0016: Treasure Hunt
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; #define PI 3.1415926535897932 int main(){ int a,b,theta=90; double x=0,y=0,pi=PI; for(;;){ scanf("%d,%d",&a,&b); if(a==0 && b==0){ break; } y+=a*sin(theta/180.0*pi); x+=a*cos(theta/180.0*pi); theta+=b; } printf("%d\n%d\n",(int)-x,(int)y); return 0; }
よく憶えてなし。
0017: Caesar Cipher
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; #define PI 3.1415926535897932 // #54797 int main(){ int len,flg; char s[84]; while (fgets(s,84,stdin)!=NULL) { len=strlen(s)-1; flg=1; while (flg) { for (int i=0;i<len;i++) { if (islower(s[i])) { s[i]=(s[i]-'a'+1)%26+'a'; } } for (int i=0;i<len;i++) { if (!strncmp(&s[i],"the",3) || !strncmp(&s[i],"this",4) || !strncmp(&s[i],"that",4)) { flg=0; break; } } } printf("%s",s); } return 0; }
写経した。
0018: Sorting Five Numbers
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int mod=1000000007; vector<int> a(5); for(auto&e:a) { scanf("%d",&e); } sort(a.begin(),a.end()); for(int i=4;i>0;i--) { printf("%d ",a[i]); } printf("%d\n",a[0]); return 0; }
ソートや出力順に気をつければ大丈夫だと思う。
0019: Factorial
C++14
#include<bits/stdc++.h> #include<vector> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std; int main(){ int mod=1000000007; int n; long ans=1; scanf("%d",&n); for(int i=n;i>1;i--) { ans*=i; } printf("%ld\n",ans); return 0; }
forループで計算し続ければ大丈夫だと思う。