Jin.のプログラム備忘録

適当な自分の備忘録

選挙のソート[制作時間: 58分45秒]

今日は、選挙のソートをしました。
説明からすると、演説する毎に立候補者の支持者が1減り、その減った分演説者の支持が増えるというものです。
ですが、今回は成功しませんでした。
たぶんですが、最後の出力が原因だと思っています。
支持者数1位だけを出力するのに対し、1人しか出力できないようにしてしまいました。
これでは、支持者数が被った場合が、出力できないことに気づきました。

ほかにミスを発見された方はコメントお願いします!!

#include <stdio.h>
int main(void){
    int candidates;     //立候補者
    int voter;          //有権者
    int numSpeech;      //演説回数
    
    scanf("%d", &candidates);
    scanf("%d", &voter);
    scanf("%d", &numSpeech);
    
    int speaker;                    //演説者
    int supporter[candidates + 1];      //支持者 + 指示していない人
    
    // 初期化 //////////////////////////////////
    for(int i = 0; i <= candidates; i++)
    {
        supporter[i] = 0;           //立候補者の支持者を初期化
        
        if(i == candidates)
        {
            supporter[i] = voter;   //最後の配列に全有権者を入れる
        }
    }
    ///////////////////////////////////////////
    
    // 実行 ///////////////////////////////////
    for(int i = 0; i < numSpeech; i++)
    {
        scanf("%d", &speaker);
        
        for(int j = 0; j <= candidates; j++)
        {
            if(supporter[j] != 0)
            {
                supporter[j] -= 1;
                supporter[i] += 1;
            }
        }
    }
    ///////////////////////////////////////////
    
    // ランク付け /////////////////////////////
    int result = 0;     //結果
    
    for(int i = 0; i < candidates; i++)
    {
        for(int j = i + 1; j < candidates; j++)
        {
            if(i != result)
            {
                if(supporter[result] < supporter[j])
                {
                    result = j;
                    i = 0;
                }   
            }
        }
    }
    ///////////////////////////////////////////
    
    // 出力 ///////////////////////////////////
    printf("%d",result + 1);
    ///////////////////////////////////////////
    
}

真剣衰弱[制作時間:52分31秒]

読込のところで入力して、誰が何枚持っているかを
表示させるプログラムです。
ほぼほぼ未完成です。

 #include <stdio.h>
int main(void){
    
    int height;    // 縦列
    int width;     // 横列
    int num;       // 参加人数
    // 読込///////////////////////
    scanf("%d",&height);
    scanf("%d",&width);
    scanf("%d",&num);
    //////////////////////////////
    
    int cardtile[height][width];    // カードの多次元配列
    // 初期化//////////////////////////////
    for(int i = 1; i <= height; i++)
    {
        for(int j = 1; j <= width; j++)
        {
            cardtile[i][j] = 0;
        }
    }
    ///////////////////////////////////////
    
    // カードの読込////////////////////////
    for(int i = 1; i <= height; i++)
    {
        for(int j = 1; j <= width; j++)
        {
            scanf("%d",&cardtile[i][j]);
        }
    }
    ///////////////////////////////////////
    
    int gameLog;   // ログの回数
    // 読込////////////////////
    scanf("%d",&gameLog);
    ///////////////////////////
    
    int player[num];                // プレイヤーの得点
    // 初期化////////////////////
    for(int i = 0; i < num; i++)
    {
        player[i] = 0;
    }
    /////////////////////////////
    int row, row2;                  // 行
    int column, column2;            // 列
    int turn = 0;                   // ターン
    
    // ゲーム基礎・得点配分/////////////////
    for(int i = 0; i < gameLog; i++)
    {
        // 読込///////////////
        scanf("%d",&column);
        scanf("%d",&row);
        scanf("%d",&column2);
        scanf("%d",&row2);
        //////////////////////
        
        // カードが同じだったら2点
        if(cardtile[column][row] == cardtile[column2][row2])
        {
            player[turn] += 2;
        }
        //違ったら次の人に変更
        else
        {
            if(turn == num - 1)
            {
                turn = 0;
            }
            else
            {
                turn += 1;
            }
        }
        
    }
    ////////////////////////////////////////
    
    // 結果発表///////////////////////
    for(int i = 0; i < num; i++)
    {
        printf("%d\n",player[i]);
    }
    //////////////////////////////////
}