[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分,所以就没有刷这一章节的最后一题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值