[PTA-C 言語] プログラミング演習 4 - 配列 I

7-1 ジャッジスコア (スコア 10)

著者 ウェン カイ
単位 浙江大学

クラス内ではクイズ大会が開催されます!生徒たちはみんな熱心に参加しています。決勝戦には10名の生徒が出場し、次々と問題が出題され、ある時は1番の選手が得点、またある時は5番の選手が得点し、それぞれ正解した人が10点を獲得しました。

入力形式:
最初の行には、10 人の生徒の初期スコアを表す 10 個の整数が含まれています。 2 行目には整数 n が含まれており、コンテストに n 個の質問があることを示します。
次に n 行あり、各行には数字 x があり、x は今回追加ポイントを獲得できるプレイヤーの数を表します (各正解は 10 ポイントを獲得します)。

出力形式:
10 人の生徒の最終得点値。2 人ごとにスペースが入ります。

入力例:

10 0 0 0 10 10 0 0 0 10
3
1
10
1

出力サンプル:

30 0 0 0 10 10 0 0 0 20

コードの長さ制限
16 KB
時間制限
400 ミリ秒
メモリ制限
64 MB

参照コード

#include<stdio.h>
int main()
{
    
    
    int i, j, n, b;
    int a[10];
    for(i=0; i<10; i++)
        scanf("%d", &a[i]);
    scanf("%d", &n);
    for(i=0; i<n; i++) {
    
    
        scanf("%d", &b);
        a[b-1] += 10;
    }
    for(i=0; i<10; i++)
        if(i==9)
            printf("%d", a[i]);
        else
            printf("%d ", a[i]);
    return 0;
}

7-2 組み合わせ数の和(端数10)

著者 Chen Yue
単位 浙江大学

N 個のゼロ以外の 1 桁の数値が与えられると、そのうちの任意の 2 つを組み合わせて 2 桁の数値にすることができます。 2 桁の数字の可能なすべての組み合わせの合計を求めます。たとえば、2、5、および 8 が与えられた場合、25、28、52、58、82、85 を組み合わせることができ、それらの合計は 330 になります。

入力形式:
入力では、最初に N (1 < N < 10) が 1 行に入力され、次に N 個の異なる非ゼロ数字が 1 行に続きます。数字はスペースで区切ります。

出力形式:
2 桁の数値のすべての可能な組み合わせの合計を出力します。

入力例:

3
2 8 5

出力サンプル:

330

コードの長さ制限
16 KB
時間制限
400 ミリ秒
メモリ制限
64 MB

参照コード

#include<stdio.h>
int main()
{
    
    
    int i, j, n, sum=0;
    int a[100];
    scanf("%d", &n);
    for(i=0; i<n; i++)
        scanf("%d", &a[i]);
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
            if(j!=i)
                sum += a[i]*10+a[j];
    printf("%d\n", sum);
    return 0;
}

7-3 間違い探し(ポイント15)

著者 胡偉平
単位 広西科学技術大学

これはサインインに関する非常に簡単な質問です。ネチズンのグループがオンラインで誰が一番違うかを競うゲームをしています。各人が個別に数字を書いて順番に送信します。他の人のデータと重複しない人のデータが勝ちです。多くの人がいる場合、違う人は、最初にやるのは本当に違います。

入力形式:
入力はテスト ケースです。最初にネチズンの数 N が与えられ、次に N 個の正の整数が順番に与えられます。与えられた正の整数と N 10の5乗を超えないようにしてください。

出力形式:
入力セットごとに、一意の数値を出力します。そうでない場合は、出力Noneします。

入力例 1:
ここに一連の入力を入力します。例:

8 1 2 3 4 4 5 3 1

出力サンプル 1:
対応する出力をここに示します。例:

2

入力例 2:
ここに一連の入力を入力します。例:

8 1 2 3 4 4 3 2 1

出力サンプル 2:
対応する出力をここに示します。例:

None

コードの長さ制限
16 KB
時間制限
200 ミリ秒
メモリ制限
64 MB

参照コード

#include <stdio.h>
int main()
{
    
    
    int i, j, N, m=0, n=0;
    scanf("%d", &N);
    int a[N];
    for(i=0; i<N; i++)
        scanf("%d", &a[i]);
    for(i=0; i<N; i++) {
    
    
        for(j=0; j<N; j++)
            if(a[i]==a[j] && i!=j)
                m++;
        if(m==0){
    
    
            printf("%d",a[i]);
            break;
        }
        n++;
        m=0;
    }
    if(n==N)
        printf("None");
    return 0;
 }

7-4 二分探索を使用して、見つかったすべてのデータを検索します (スコア 15)

著者 Sun Jun
ユニット 武漢理工大学

二分法を使用して、N (N≤20) 個の要素を含む順序付けられたシーケンスで指定された値 y を見つけます。 y を見つけた後、まず検索回数を出力し、次に配列内の対応する添字を出力します。シーケンス内に複数の y がある場合は、すべての y の位置を添字付きの番号の順に出力します。
それ以外の場合は、「見つかりません」と出力します。

入力形式:
入力では、1 行目に 20 以下の数値 N が指定されます。 2 行目にスペースで区切って N 個の数値 (昇順) を入力します。最後に、検索対象のデータ y が 3 行目に与えられます。

出力形式:
シーケンス内に y が存在する場合: 最初にクエリの数を出力し、次に各行の位置値を「position: k」の形式で出力します。
シーケンスに y がない場合: 「見つかりません」と出力します。

入力例1:

10
34 56 78 87 87 87 87 112 520 888
87

出力サンプル 1:

查找次数1
位置:3
位置:4
位置:5
位置:6

入力例2:

10
34 56 78 87 87 87 87 112 520 888
80

出力サンプル 2:

not found

コードの長さ制限
16 KB
時間制限
400 ミリ秒
メモリ制限
64 MB

参照コード

#include<stdio.h>
int main()
{
    
    
    int n, b, i, j=0, l=0, h, mid, sum=1;
    int a[20];
    scanf("%d", &n);
    h = n-1;
    for (i=0; i<n; i++)
        scanf("%d", &a[i]);
    scanf("%d", &b);
    while(l<=h) {
    
    
        mid = (l+h)/2;
        if(b==a[mid])
            break;
        else if(b<a[mid])
            h = mid-1;
        else
            l = mid+1;
        sum++;
    }
    for(i=0; i<n; i++)
        if(a[i]==b)
            if(j==0) {
    
    
                j=1;
                printf("查找次数%d\n", sum);
                printf("位置:%d\n", i);
            } else
                printf("位置:%d\n", i);
    if(j==0)
        printf("not found");
    return 0;
}

7-5 上三角行列を決定する (スコア 10)

著者 C コース グループ
ユニット浙江大学

上三角行列とは、主対角線より下のすべての要素が 0 である行列を指します。主対角線は、行列の左上隅と右下隅を結ぶ線です。

この質問では、指定された正方行列が上三角行列であるかどうかを判断するプログラムを作成する必要があります。

入力形式:
入力の最初の行は、テストする行列の数を表す正の整数 T を与えます。次に、T 個の行列の情報が与えられます。各行列情報の最初の行には、10 を超えない正の整数 n が与えられます。次に n 行があり、各行にはスペースで区切られた n 個の整数が示されます。

出力形式:
各行列の判定結果が 1 行に表示されます。入力行列が上三角行列の場合は「YES」、それ以外の場合は「NO」を出力します。

入力例:

3
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
3
1 2 3
1 4 5
0 -1 6

出力サンプル:

YES
NO
NO

データを補足してくださった中国第 7 水道局機械電気設備支局の Yu Chunqiao 氏に感謝します。

コードの長さ制限
16 KB
時間制限
400 ミリ秒
メモリ制限
64 MB

参照コード

#include<stdio.h>  
int main()
{
    
      
    int T, m, n, i, j, flag;
    int a[10][10];
    scanf("%d", &T);
    for(m=0; m<T; m++) {
    
    
        flag = 1;
        scanf("%d", &n);
        for(i=0; i<n; i++)
            for(j=0; j<n; j++) {
    
    
                scanf("%d", &a[i][j]);
                if(i>j && a[i][j]!=0)
                    flag=0;
            }
        if(flag)
            printf("YES\n");  
        else   
            printf("NO\n");
    }
    return 0;
}

7-6 正方行列が右に循環移動 (スコア 15)

著者 ヤン ホイ
単位 浙江市大学

この質問では、与えられた n×n 正方行列の各要素を m 位置右に循環シフトするプログラムを書く必要があります。つまり、0 番目、1 番目、⋯、および n−1 列を n−m、n−m 列に変換します。 +1 ,⋯,n−1,0,1,⋯,n−m−1 列。

入力形式:
入力の最初の行では、2 つの正の整数 m と n (1≤n≤6) が与えられます。次に合計 n 行があり、各行には n 個の整数が含まれており、n 次の正方行列を表します。

出力形式:
移動した正方行列を入力形式に従って出力します。つまり、n 行、各行に n 個の整数を出力し、各整数の後にスペースを出力します。

入力例:

2 3
1 2 3
4 5 6
7 8 9

出力サンプル:

2 3 1  5 6 4  8 9 7

コードの長さ制限
16 KB
時間制限
400 ミリ秒
メモリ制限
64 MB

参照コード

#include <stdio.h>
int main()
{
    
    
    int i, j, n, m;
    int a[10][10];
    scanf("%d %d", &m, &n);
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
            scanf("%d", &a[i][j]);
    m%=n;
    for(i=0; i<n; i++) {
    
    
        for(j=0; j<n; j++)
            printf("%d ", a[i][(n-m+j)%n]);
        printf("\n");
    }
    return 0;
}

7-7 三目並べゲーム – 勝者または敗者 (スコア 15)

著者 Li Min
ユニット 武漢理工大学

三目並べは、3x3 のマス目上でプレイする接続ゲームで、バックギャモンに似ており、ボードには通常枠がなく、マス目線が三目並べのパターンで配置されていることからその名が付けられました。

ゲームのルール: 2 人のプレーヤーがそれぞれ O と X を表し、順番にグリッドにマークを残します。 3 つのマーカーを直線で結ぶことに成功した最初のチームが勝ちます。 (百度百科事典より抜粋)

ここに画像の説明を挿入します

3X3 の 2 次元配列を読み取ります。配列要素は 'X' (X をプレイすることを意味します) 要素は 'O' (O をプレイすることを意味します) 配列要素は '.' (英語の記号 "ドット") で、これは意味しますチェスは行われていません。今の結果を判断するプログラムを作成してください。X 側が勝った場合は「X 勝ち!」と表示されます。O 側が勝った場合は「O 勝ち!」と表示されます。

入力形式:
3X3 の 2 次元配列で読み取ります。配列要素は 'X' (X を意味します)、要素 'O' (O を意味します)、および配列要素は '.' (英語の記号「point」) はチェスがプレイされていないことを意味します。

出力形式:
「No one win!」が表示される場合。

入力例1:

X.O
OX.
O.X

出力サンプル 2:

X win!

入力例2:

O.O
XX.
X..

出力サンプル 2:

No one win!

コードの長さ制限
16 KB
時間制限
400 ミリ秒
メモリ制限
64 MB

参照コード

#include <stdio.h>
int main()
{
    
    
    char a[4][4];
    int i, flag1=0, flag2=0;
    for(i=0;i<3;i++)
        scanf("%s",a[i]);
    for(i=0;i<3;i++)
        if((a[i][0]==a[i][1])&&(a[i][1]==a[i][2])&&(a[i][0]==a[i][2]))
            if(a[i][0]!='.')
                if(a[i][0]=='X')
                    flag1=1;
                else
                    flag2=1;
    for(i=0;i<3;i++)
        if((a[0][i]==a[1][i])&&(a[1][i]==a[2][i])&&(a[0][i]==a[2][i]))
            if(a[0][i]!='.')
                if(a[0][i]=='X')
                    flag1=1;
                else
                    flag2=1;
    if(((a[0][0]==a[1][1])&&(a[1][1]==a[2][2])&&(a[0][0]==a[2][2]))||((a[0][2]==a[1][1])&&(a[1][1]==a[2][0])&&(a[0][2]==a[2][0])))
        if(a[1][1]!='.')
            if(a[1][1]=='X')
                flag1=1;
            else
                flag2=1;
    if(flag1&&(flag2==0))
        printf("X win!\n");
    else if((flag1==0)&&flag2==1)
        printf("O win!\n");
    else
        printf("No one win!\n");
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_45801887/article/details/134821989