[code] PTA 胡凡算法筆記 DAY025

題目 B1047 編程團體賽

在這裏插入圖片描述

  • 題意
    計算每個隊伍的總分數,並輸出得分最高的隊伍編號及其分數。

  • 思路
    隊伍編號連續大小固定,直接建立數組以下標與之對應,並且在輸入的過程中就可以用一個變量去指示最大值得下標。(這裏可以巧妙利用0下標不會使用並且其值初始化爲0)

  • Code in C++

#include <cstdio>
#include <algorithm>

int group[1001] = {0};

int main()
{
    int n, gp, member, score, maxscore = 0;
    scanf("%d", &n);

    for (int i = 0; i < n; ++i) {
        scanf("%d-%d %d", &gp, &member, &score);
        group[gp] += score;
        if (group[maxscore] < group[gp]) {
            maxscore = gp;
        }
    }
    printf("%d %d", maxscore, group[maxscore]);
    return 0;
}


題目 A1041 Be Unique

在這裏插入圖片描述

  • 題意
    輸入n個數,輸出第一個不與其他數重複的數。

  • 思路
    根據需求很明顯與輸入數相關,所以需要將輸入數存下來,然後在輸入的過程中對每個數出現的次數記錄,然後遍歷輸入的數,如果次數爲1則輸出即可。

  • Code in C++

#include <cstdio>
#define maxnu 10001
#define maxn 100001
int number[maxnu] = {0};
int guess[maxn] = {0};

int main()
{
    int n;
    scanf("%d",&n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &guess[i]);
        ++number[guess[i]];
    }
    int num = -1;
    for (int i = 0; i < maxn; ++i) {
        if (number[guess[i]] == 1) {
            num = guess[i];
            break;
        }
    }
    if (num == -1) printf("None");
    else printf("%d", num);
    return 0;
}


題目 A1050 String Subtraction

在這裏插入圖片描述

  • 題意
    輸出去除第二個字符串中字符後第一個字符串的結果。

  • 思路
    記錄第二個串中出現的字符,因爲字符最多256個,值大小爲0-255。所以我這裏直接申請了大小爲256的數組。然後遍歷第一個字符串,輸出沒有出現的字符。

  • Code in C++

#include <iostream>
#include <string>

int hashTable[256] = {0};

int main()
{
    std::string s1, s2;
    getline(std::cin, s1);
    getline(std::cin, s2);
    for (int i = 0; i < s2.size(); ++i) {
        ++hashTable[s2[i]];
    }

    for (int i = 0; i < s1.size(); ++i) {
        if (hashTable[s1[i]] == 0) {
            printf("%c", s1[i]);
        }
    }
    return 0;
}


題目 B1005 繼續(3n+1)猜想

在這裏插入圖片描述

  • 題意
    按從大到小的順序輸出沒有被其他數字在求解3n+1過程中覆蓋的數字。

  • 思路
    對於輸入的每個數字都進行3n+1操作,然後針對操作過程中的每個n爲映射中的鍵,遇到就加一。存下輸入的數組,並對其排序,然後逆序遍歷找到其中值爲1的項就輸出,這裏通過flag去控制是否輸出空格。
    注意:映射方式如果採用數組的話大小不能設置太小,因爲99會因爲計算過程暴漲到224,我試了好幾次改大小但是還是段錯誤了。後來直接換了map的方式。

  • Code in C++

#include <cstdio>
#include <algorithm>
#include <map>
#define maxn 101
int number[maxn] = {0};
std::map<int, int> hashTable;
void guess(int n) {
    while (n!=1) {
        if (hashTable.count(n) == 0) hashTable[n] = 1;
        else ++hashTable[n];
        if (n % 2 == 1) {
            n = (3*n+1) / 2;
        } else {
            n /= 2;
        }
    }
}

int main()
{
    int k;
    scanf("%d", &k);
    for (int i = 0; i < k; ++i) {
        scanf("%d", &number[i]);
        guess(number[i]);
    }
    std::sort(number, number + k);
    bool flag = false;
    for (int i = k - 1; i >= 0; --i) {
        if (hashTable.count(number[i]) && hashTable[number[i]] == 1) {
            if (flag) printf(" ");
            flag = true;
            printf("%d",number[i]);
        }
    }
    return 0;
}


小結

map映射方式可以用於不確定大小的情況以及下標不連續的情況,其他情況使用數組更爲優化。

今天刷題依舊還是挺快的,最後一個的數組大小調了一會兒,耗時卡到了59分,所以就沒有刷這一章節的最後一題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章