AOJ ITP1 6.Array
はい。
http://judge.u-aizu.ac.jp/onlinejudge/topic.jsp?cid=ITP1#problems/ITP1_6
A.Reversing Numbers
input() print' '.join(map(str,raw_input().split())[::-1])
C++11
#include<bits/stdc++.h> #include<vector> #include<algorithm> using namespace std; int main(){ int n; scanf("%d",&n); vector<int>ar(n); for(auto&e:ar){ scanf("%d",&e); } for(int i=n-1;i>0;i--){ printf("%d ",ar[i]); } printf("%d\n",ar[0]); return 0; }
1行で並んだ数列の入力を受けるのにpythonだと何個受け取るかを指定する必要がないし、逆順にするのも[::-1]で出来るのでn個の数を〜〜という時のnは変数に代入せずに捨ててしまっても大丈夫だったりする。Cとかだと受け取る個数を指定したり逆順で出力する時とかにnがいくつであるかの情報が必要だと思う。
B.Finding Missing Cards
n=input() s=[[1 for i in range(13)] for j in range(4)] for i in range(n): a,b=map(str,raw_input().split()) b=int(b) if a=='S':s[0][b-1]=0 elif a=='H':s[1][b-1]=0 elif a=='C':s[2][b-1]=0 else:s[3][b-1]=0 for i in range(4): for j in range(13): if s[i][j]: if i==0:print'S',j+1 if i==1:print'H',j+1 if i==2:print'C',j+1 if i==3:print'D',j+1
C++11
#include<bits/stdc++.h> #include<vector> #include<algorithm> using namespace std; int main(){ double pai=3.141592653589; int n,p; char s; int card[4][13]; scanf("%d",&n); for(int i=0;i<4;i++){ for(int j=0;j<13;j++){ card[i][j]=0; } } for(int i=0;i<n;i++){ scanf("%s %d",&s,&p); if(s=='S'){ card[0][p-1]=1; }else if(s=='H'){ card[1][p-1]=1; }else if(s=='C'){ card[2][p-1]=1; }else if(s=='D'){ card[3][p-1]=1; } } for(int i=0;i<4;i++){ for(int j=0;j<13;j++){ if(card[i][j]==0){ if(i==0) printf("S %d\n",j+1); if(i==1) printf("H %d\n",j+1); if(i==2) printf("C %d\n",j+1); if(i==3) printf("D %d\n",j+1); } } } return 0; }
カードの有り無しを配列に保管する以外は特に方法は無いと思う。C++では配列をintではなくてbool型も指定できるらしいので有り無しを0,1で判定するならboolのが良いかもしれない。
C.Official House
l=[[[0 for i in range(10)]for j in range(3)]for k in range(4)] s='#'*20 n=input() for i in range(n):b,f,r,v=map(int,raw_input().split());l[b-1][f-1][r-1]+=v for i in range(4): for j in range(-3,0):print ' '+' '.join(map(str,l[i][j])) if i<3:print s
C++11
#include<bits/stdc++.h> #include<vector> #include<algorithm> using namespace std; int main(){ double pai=3.141592653589; int n,b,f,r,v; int room[4][3][10]; scanf("%d",&n); for(int i=0;i<4;i++){ for(int j=0;j<3;j++){ for(int k=0;k<10;k++){ room[i][j][k]=0; } } } for(int i=0;i<n;i++){ scanf("%d %d %d %d",&b,&f,&r,&v); room[b-1][f-1][r-1]+=v; } for(int i=0;i<4;i++){ for(int j=0;j<3;j++){ for(int k=0;k<10;k++){ printf(" %d",room[i][j][k]); } if(j!=2 || (j==2 && i==3)){ printf("\n"); }else if(i!=3){ printf("\n####################\n"); } } } return 0; }
この問題も配列に保存して結果を出力すれば大丈夫っぽいし、特に工夫する要素は無いと思う。
D.Matrix Vector Multiplication
n,m=map(int,raw_input().split()) a,b=[],[] for i in range(n):a.append(map(int,raw_input().split())) for i in range(m):b.append(input()) for i in range(n): ans=0 for j in range(m): ans+=a[i][j]*b[j] print ans
c++11
#include<bits/stdc++.h> #include<vector> #include<algorithm> using namespace std; int main(){ double pai=3.141592653589; int n,m,t; scanf("%d %d",&n,&m); int a[n][m], b[m], ans[n]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&a[i][j]); } } for(int i=0;i<m;i++){ scanf("%d",&b[i]); } for(int i=0;i<n;i++){ t=0; for(int j=0;j<m;j++){ t+=(a[i][j]*b[j]); } ans[i]=t; } for(int i=0;i<n;i++){ printf("%d\n",ans[i]); } return 0; }
初見では学生時代に数学をさっぱりやってなかったので問題が何を言ってるのかわからなかった。
計算内容は出力の1行目は\(a{1_1}\) * \(b_1\)から \(a{1_m}\) * \(b_m\) までの積の総和を1行ずつ順番に実行する。と書いても全然わかりやすくないというか問題文にも計算方法は書いてあるわけで。。。