2023年 牛客周赛 Round 1题解

1.游游画U

A-游游画U_牛客周赛 Round 1 (nowcoder.com)

2023年 牛客周赛 Round 1题解_第1张图片

 给你一个数字,然后看图找规律模拟把U模拟出来,方法有点简单(笨)

#include 
#include 
#include 
using namespace std;

int main() {
//    ::freopen("G:\\Desktop\\untitled\\input.txt", "r", stdin);
//    ::freopen("G:\\Desktop\\untitled\\output.txt", "w", stdout);
    int n;
    cin >> n;
    for(int i = 1; i <= 3 * n; i++){
        for(int j = 1; j <= n; j++) std::cout << "*";
        for(int j = 1; j <= n; j++) std::cout << ".";
        for(int j = 1; j <= n; j++) std::cout << ".";
        for(int j = 1; j <= n; j++) std::cout << "*";
        std::cout << std::endl;
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= i; j++) std::cout << ".";
        for(int j = 1; j <= n; j++) std::cout << "*";
        for(int j = n - i; j; j--)  std::cout << ".";
        for(int j = n - i; j; j--)  std::cout << ".";
        for(int j = 1; j <= n; j++) std::cout << "*";
        for(int j = 1; j <= i; j++) std::cout << ".";
        std::cout << std::endl;
    }
}

 2.游游的数组染色

B-游游的数组染色_牛客周赛 Round 1 (nowcoder.com)

2023年 牛客周赛 Round 1题解_第2张图片

根据第三行给的字符串,将第二行对应的数字分别存储在一个vector和map之中,vector中存放着字符B对应的数字, map中存放字符‘R’对应的数字出现的次数。遍历vector,统计每个元素在map中的值。最后的统计值就是答案。

#include 
#include 
#include 
#include 
#include 
#define int long long

constexpr int N = 200010;
int a[N];
std::vector b;
std::unordered_map Hash;

signed main() {
//    ::freopen("G:\\Desktop\\untitled\\input.txt", "r", stdin);
//    ::freopen("G:\\Desktop\\untitled\\output.txt", "w", stdout);
    int n;
    std::cin >> n;
    for(int i = 0; i < n; i++) std::cin >> a[i];
    std::string s;
    std::cin >> s;
    for(std::size_t i = 0; i < s.length(); i++){
        if(s[i] == 'B') b.push_back(a[i]);
        else Hash[a[i]]++;
    }
    int ans = 0;
    for(const auto &ix : b) {
        ans += Hash[ix];
    }
    std::cout << ans << std::endl;

}

3.游游的交换字符

C-游游的交换字符_牛客周赛 Round 1 (nowcoder.com)

2023年 牛客周赛 Round 1题解_第3张图片

这个会需要进行分类讨论,如果字符串长度是奇数,那么只有比较多的那个字符排在第一个才能满足条件——例如"10101","010";此时我们统计不在对应位置的字符在字符串中的下标,记录在两个vector里面(因为是从0开始遍历的,所以两个vector中统计的序列是有序的) ,然后遍历一下,统计一下对应位置相减的绝对值的和即可。如果是相同的,那么无法判断第一位是‘0’需要变化得少还是首位是‘1’变化得少,此时需要两种都进行统计一下,求出两种情况之中的 最小值即是结果。

#include 
#include 
#include 
#include 
#include 
#define int long long

std::string s;
std::vector v1, v2;
int solve(char a, char b){
    v1.clear();
    v2.clear();
    for(std::size_t i = 0; i < s.length(); i += 2)  if(s[i] != a)   v1.push_back(i);
    for(std::size_t j = 1; j < s.length(); j += 2)  if(s[j] != b)   v2.push_back(j);
    int res = 0;
    for(std::size_t i = 0; i < v1.size(); i++){
        res += std::abs(v1[i] - v2[i]);
    }
    return res;
}

signed main() {
    //::freopen("G:\\Desktop\\untitled\\input.txt", "r", stdin);
    //::freopen("G:\\Desktop\\untitled\\output.txt", "w", stdout);
    std::cin >> s;
    int cnt_0 = 0, cnt_1 = 0;
    for(std::size_t i = 0; i < s.length(); i++){
        if(s[i] == '1') cnt_1++;
        else cnt_0++;
    }
    if(cnt_1 > cnt_0)   std::cout << solve('1', '0') << std::endl;
    else if(cnt_0 > cnt_1)  std::cout << solve('0', '1') << std::endl;
    else if(cnt_1 == cnt_0){
        std::cout << std::min(solve('1', '0'), solve('0', '1')) << std::endl;
    }
    return 0;
}

4.游游的9的倍数

D-游游的9的倍数_牛客周赛 Round 1 (nowcoder.com)

2023年 牛客周赛 Round 1题解_第4张图片

 已知:能够被9整除的数的每位上的数的和相加是一定能够被9整除的;

例如——18,27,36,45,54,90,180

那么我们可以统计子序列的每位数字上的和(对9求模)出现的次数,然后dp背包跑一遍,最后需要的结果就是余数为0(dp[n][0])的结果。

#include 
#include 
#include 
#include 
#include 
#define int long long
constexpr int mod = 1e9 + 7;
int dp[200005][10];
signed main() {
    //::freopen("G:\\Desktop\\untitled\\input.txt", "r", stdin);
    //::freopen("G:\\Desktop\\untitled\\output.txt", "w", stdout);
    std::string s;
    std::cin >> s;
    int n = s.size();
    for (int i = 0; i < n; i++) {
        int x = s[i] - '0';
        dp[i + 1][x % 9] = (dp[i + 1][x % 9] + 1) % mod;
        for (int j = 0; j < 9; j++) {
            dp[i + 1][j] = (dp[i + 1][j] + dp[i][j]) % mod;
            dp[i + 1][(j + x) % 9] = (dp[i + 1][(j + x) % 9] + dp[i][j]) % mod;
        }
    }
    std::cout << dp[n][0] << std::endl;
    return 0;
}

总结:距离AK就差了两三分钟(还是自己太弱了),最后交题的时候才发现已经超时了几分钟。主要就是问题三当时没发现偶数需要取最小值的情况啦。

第一次写题解,感觉有很多地方描述不清楚,233。

你可能感兴趣的:(c++,算法)