牛客周赛 31

牛客周赛 Round 31

A 小红小紫替换

语法

#include <bits/stdc++.h>

using namespace std;

int main()
{
    string s;
    cin >> s;
    if(s == "kou"){
        cout << "yukari";
    }else{
        cout << s;
    }
    return 0;
}

B 小红的因子数

分解质因数

#include <bits/stdc++.h>

using namespace std;

int main()
{
    long long n;
    cin >> n;
    if(n == 1){
        cout << 0;
        return 0;
    }
    int ans = 0;
    for(int i = 2 ; i <= n / i ; i ++){
        if(n % i == 0){
            ans ++;
            while(n % i == 0){
                n /= i;
            }            
        }
    }
    if(n > 1)ans ++;
    cout << ans;
    return 0;
}

C 小红的字符串中值

看左右两边最短的

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    char k;
    cin >> n >> k;
    string s;
    cin >> s;
    long long ans = 0;
    int len = s.size();
    for(int i = 0 ; i < len; i ++){
        if(s[i] == k){
            ans += min(i, (len - i - 1)) + 1;
        }
    }
    cout << ans;
    return 0;
}

D 小红数组操作

模拟双链表

#include <bits/stdc++.h>

using namespace std;

map<int,int> l , r;//l[i]为i的左节点 , r[i]为i的右节点

int main()
{
    int n;
    cin >> n;
    int start = -1e9-1 , end = 1e9+1;
    r[start] = end;
    l[end] = start;
    while(n --){
        int op;
        cin >> op;
        if(op == 1){
            int a , b;
            cin >> a >> b;
            int ll , rr; // a插在ll , rr之间
            if(b == 0){
                ll = start;
                rr = r[start];
            }else{
                ll = b;
                rr = r[b];
            }
            r[ll] = a;
            r[a] = rr;
            l[a] = ll;
            l[rr] = a;
        }else{
            int t;
            cin >> t;
            int ll = l[t] , rr = r[t];
            r[ll] = rr;
            l[rr] = ll;
        }
    }
    int u = start , cnt = 0;
    while(r[u] != end){
        cnt ++;
        u = r[u];
    }
    u = start;
    cout << cnt << endl;
    while(r[u] != end){
        cout << r[u] << " ";
        u = r[u];
    }
    
    return 0;
}

E 小红的子集取反

变种的背包dp

dp[i][j] //表示前i个数字得到j要取反的最小次数
#include <bits/stdc++.h>

using namespace std;

int dp[202][80005];

int main()
{
    int n;
    cin >> n;
    memset(dp , 0x3f , sizeof dp);
    dp[0][40000] = 0;
    for(int i = 1 ; i <= n ; i ++){
        int x;
        cin >> x;
        for(int j = 0 ; j <= 80000 ; j ++){
            if(j - x >= 0 && j - x <= 80000)dp[i][j] = min(dp[i][j] ,  dp[i - 1][j - x] + 1);
            if(j + x >= 0 && j + x <= 80000)dp[i][j] = min(dp[i][j] ,  dp[i - 1][j + x]);
        }
    }
    if(dp[n][40000] == 0x3f3f3f3f){
        cout << "-1";
    }else{
        cout << dp[n][40000];
    }
    return 0;
}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值