読者です 読者をやめる 読者になる 読者になる

AOJ ITP1 7.Structured Program II

はい。
http://judge.u-aizu.ac.jp/onlinejudge/topic.jsp?cid=ITP1#problems/ITP1_7

A.Grading

python

while True:
    n=map(int, raw_input().split())
    if n[0]==n[1]==n[2] == -1:
        break
    elif (n[0]==-1 or n[1]==-1) or int(n[0])+int(n[1]) < 30:
        print 'F'
    elif int(n[0])+int(n[1])>=80:
        print 'A'
    elif int(n[0])+int(n[1])>=65:
        print 'B'
    elif int(n[0])+int(n[1])>=50:
        print 'C'
    elif int(n[0])+int(n[1])>=30:
        if n[2]<50:
            print 'D'
        else:
            print 'C'
    else:
        print 'F'

C++11

#include<bits/stdc++.h>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
    double pai=3.141592653589;
    int a,b,c;
    for(;;){
        scanf("%d %d %d",&a,&b,&c);
        if(a+b+c==-3){
            break;
        }else if(a+b>=80){
            printf("A\n");
        }else if(a+b>=65){
            printf("B\n");
        }else if(a+b>=50 || (a+b>=30 && c>=50)){
            printf("C\n");
        }else if(a+b>=30 && a!=-1 && b!=-1){
            printf("D\n");
        }else{
            printf("F\n");
        } 
            
    }
    return 0;
}

丁寧に問題文で指定されている通りに分岐させれば大丈夫。

B.How many ways?

python

while 1:
    a=0
    n,x=map(int,raw_input().split())
    if n==0:break
    for i in range(1,n-1):
        for j in range(i+1,n):
            c=x-i-j
            if c>j and c<=n:a+=1
    print a

C+11

#include<bits/stdc++.h>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
    double pai=3.141592653589;
    int n,x,ans;
    for(;;){
        scanf("%d %d",&n,&x);
        ans=0;
        if(n==0) break;
        for(int i=1;i<n-1;i++){
            for(int j=i+1;j<n;j++){
                for(int k=j+1;k<=n;k++){
                    if(i+j+k==x){
                        ans++;
                    }
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

おそらく三重か二重ループで調べる以外には特に方法が無いと思う。三重ループはループから出てくる3つの数の和がxになるかを調べる。二重ループはxから2つのループから出てきた数を引いいた差が2つ目のループのものより大きい数でn以下であるなら組み合わせ成立と判定する。
例えばn=5, x=9でa=2, b=3のときにb+1からnまで1つずつ加算して調べるのが三重ループです。同じくn=5, x=9でa=2, b=3のときに、9から2と3を引くとn=5以下の4が出てくるので組み合わせ成立と判定する。 成立しない場合だとnとxが同じでa=1, b=2のときに3つ目の数をb+1からnまで1つずつ加算して最後まで出てこなくて組み合わせなしと判定する。二重ループだとxからa,bを引いた差が6となりnより大きいのでこのa=1, b=2のときには組み合わせなしと判定できる。

C.Spreadsheet

r,c=map(int,raw_input().split()) l=[] for i in range(r):l.append(map(int,raw_input().split())) l.append([0]*(c+1)) for i in range(c+1): for j in range(r): if i==0:l[j].append(sum(l[j])) l[-1][i]+=l[j][i] for i in range(r+1):print' '.join(map(str,l[i]))

  
C++11  

include<bits/stdc++.h>

include

include

using namespace std;

int main(){ double pai=3.141592653589; int r,c,tmp; scanf("%d %d",&r,&c); int sheet[r+1][c+1]; sheet[r][c]=0; for(int i=0;i<r;i++){ tmp=0; for(int j=0;j<c;j++){ if(i==0) sheet[r][j]=0; scanf("%d",&sheet[i][j]); tmp+=sheet[i][j]; sheet[r][j]+=sheet[i][j]; sheet[r][c]+=sheet[i][j]; } sheet[i][c]=tmp; } for(int i=0;i<r+1;i++){ for(int j=0;j<c+1;j++){ if(j<c){ printf("%d ",sheet[i][j]); }else{ printf("%d\n",sheet[i][j]); } } } return 0; }

  
pythonは一行の数列をまとめて受け取ってしまい、C++だと1つずつ受け取ったり出来るので合計の求め方がちょっと違ったりする。  
  
###D.Matrix Multiplication
  
python  

まだpythonで書いてなかった。。。

  
C++11  

include<bits/stdc++.h>

include

include

using namespace std;

int main(){ double pai=3.141592653589; int n,m,l; scanf("%d %d %d",&n,&m,&l); int a[n][m], b[m][l]; long ans[n][l]; for(int i=0;i<n;i++){ for(int j=0;j<l;j++){ ans[i][j]=0; } } 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++){ for(int j=0;j<l;j++){ scanf("%d",&b[i][j]); } }

for(int i=0;i<n;i++){
    for(int j=0;j<l;j++){
        for(int k=0;k<m;k++){
            ans[i][j]+=a[i][k]*b[k][j];
        }
    }
}
for(int i=0;i<n;i++){
    for(int j=0;j<l;j++){
        if(j!=l-1){
           printf("%ld ",ans[i][j]);
        }else{
           printf("%ld\n",ans[i][j]);
        }
    }
}
return 0;

}

  
補足を後で