牛客周赛 Round 1

游游画U

模拟就行

#include <iostream>
using namespace std;

int main(){
    int n;cin>>n;
    int c=1;
    for(int i=1;i<=n*4;i++){
            if(i<=n*3){
                  for(int j=1;j<=n*4;j++ ){
                        if(j<=n || j>3*n)cout<<'*';
                        else cout<<'.';
                  }
            }
            else {
               for(int j=1;j<=4*n;j++){
                  if(j<=c || j>4*n-c)cout<<'.';
                   else if(j>n+c&& j<=4*n-c-n)cout<<'.';
                   else cout<<'*';
               }
                c++;
            }

        cout<<endl;
}
}

游游的数组染色

利用两个map 可以分别找出 不同颜色的个数 然后遍历其中一个就行

#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
#define int long long
using namespace std;
signed main(){
    int n;cin>>n;
    vector<int> v(n);
    for(int i=0;i<n;i++){
        cin>>v[i];
    }
    string s;cin>>s;
    map<int,int> a,b;
    for(int i=0;i<n;i++){
        if(s[i]=='B'){
            b[v[i]]++;
        }
        else a[v[i]]++;
    }
    int ans=0;
    for(auto t:a){
        auto [x,y]=t;
        if(!b.count(x))continue;
        ans=ans+b[x]*y;
    }
    cout<<ans<<endl;
}

游游的交换字符

根据题意 是一定有解 说明 1的个数和0的个数一定是相差<2;说明 最后出现的情况 只会是010101 或者10101010 所以 找到其中为0的个数 如果0的个数大 说明是从下标0 开始 否则是从下标1开始, 如果相等 那么就分别从 下标0 和下标1 开始 取最小的值

#include <iostream>
#include <string>
#include <queue>
#define int long long
using namespace std;
signed main(){
    string s;cin>>s;
    int ans=1e15;
    int a=0;
   int  n=s.size();
    for(int i=1;i<n;i++){
        if(s[i]=='0')a++;
    }
    if(n-a!=a){
        int res=0;
        int pre=a>n-a?0:1;
        for(int i=0;i<n;i++){
            if(s[i]=='0'){
                res+=abs(i-pre);
                pre+=2;
            }
        }
        ans=min(ans,res);
    }
    else {
        int pre=0;
        int res=0;
        for(int i=0;i<n;i++){
            if(s[i]=='0'){
                res+=abs(i-pre);
                pre+=2;
            }
        }
        ans=min(ans,res);
        pre=1;res=0;
        for(int i=0;i<n;i++){
            if(s[i]=='0'){
                res+=abs(i-pre);
                pre+=2;
            }
        }
        ans=min(res,ans);
    }
    cout<<ans<<endl;
}

游游的9的倍数

一般这种题多半是dp ,首先考虑dp的集合 当%9 只会有0~8的可能 所以 可以写成前i个数 %9==j的方案数 考虑dp方程,dp[i][j] 对于第i个可以取可以不取 所以dp[i][j]+=dp[i-1][j]; 当取的时候,那么 dp[i][(j10+s[i]-‘0’)%9]+=dp[i-1][j]; 因为j10+s[i]-'0’就是取了当前数 之后%9 ==j 的方案数 所以最后 答案就是 dp[n][0]-1

#include <iostream>
#include <cstring>
#define int long long 
using namespace std;
const int N=2e5+10,mod=1e9+7;
char s[N];
int dp[N][9];
signed main(){
    cin>>s+1;
    int n=strlen(s+1);
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=0;j<9;j++){
            dp[i][j]+=dp[i-1][j];
            dp[i][(j*10+s[i]-'0')%9]+=dp[i-1][j];
            dp[i][j]%=mod;
            dp[i][(j*10+s[i]-'0')%9]%=mod;
        }
    }
    cout<<(dp[n][0]-1+mod)%mod<<endl;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值