Codeforces Round 871

这篇文章展示了多个编程解题函数,涉及字符串处理、计数、数组操作、二进制操作、动态规划等技术,通过实例演示了解不同问题的解决策略。
摘要由CSDN通过智能技术生成

目录

A. Love Story

B. Blank Space

C. Mr. Perfectly Fine

D. Gold Rush

E. The Lakes

F. Forever Winter

G. Hits Different

H. Don’t Blame Me


A. Love Story

直接逐个匹配

string a="codeforces";
void solve()
{
   string s; cin>>s;
   int cnt=0;
   for(int i=0;s[i];i++){
        if(a[i]!=s[i]) cnt++;
   }
   cout<<cnt<<endl;

    return ;
}

B. Blank Space


需不需要数组,直接快速判断

void solve()
{
    int cnt=0,now=0;
    cin>>n;
    while(n--){
        int x; cin>>x;
        if(!x) now++;
        else now=0;
        cnt=max(cnt,now);
    }
    cout<<cnt<<endl;

    return ;
}

C. Mr. Perfectly Fine


分类讨论注意情况的数量,是否考虑清楚了

void solve()
{
    int A= 1e9, B = 1e9,AB=1e9;
    cin>>n;
    while(n--){
        int x;string op; cin>>x>>op;
        if(op=="01") B=min(B,x);
        else if(op=="10") A=min(A,x);
        else if(op=="11")AB=min(AB,x);
    } 
    int ans=min(A+B,AB);
    cout<<(ans>=1e9 ? -1 : ans)<<endl;

    return ;
}

D. Gold Rush


简单进制变化注意次数bfs注意处理重复

void solve()
{
    cin>>n>>m;
    map<int,bool> mp;
    queue<int> q;
    q.push(n);
    while(!q.empty()){
        int t=q.front(); q.pop();
        if(mp[t]) continue;
        mp[t]=true;
        if(t==m){
            cout<<"YES"<<endl;
            return ;
        }
        if(t%3==0){
            if(!mp.count(t/3*2)) q.push(t/3*2);
            if(!mp.count(t/3)) q.push(t/3);
        }
    }
    cout<<"NO"<<endl;

    return ;
}

E. The Lakes


注意bfs的时候第一个加入的点要st[x][y]=true;
接着就是在加入点的时候就进行判断已经进入了避免多次进入无用点超时


void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>w[i][j],st[i][j]=false;



    auto bfs = [&] (int x,int y){
        queue<PII> q;
        q.push({x,y});
        int res=w[x][y];
        st[x][y]=true;
        while(!q.empty()){
            auto [x,y]=q.front(); q.pop();
            int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
            for(int i=0;i<4;i++){
                int a=x+dx[i],b=y+dy[i];
                if(a<1||a>n||b<1||b>m) continue;
                if(st[a][b]) continue;
                if(!w[a][b]) continue;
                res+=w[a][b];
                st[a][b]=true;
                q.push({a,b});
            }
        }
        return res;
    };

    int ans=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(!st[i][j] && w[i][j]){
                ans=max(ans,bfs(i,j));
            }

    cout<<ans<<endl;
    return ;
}

F. Forever Winter


注意题目的特征描述,找到和发现性质即可

void solve()
{
    map<int,int> mp;
    cin>>n>>m;

    for(int i=1;i<=n;i++) p[i]=0;

    while(m--){
        int a,b; cin>>a>>b;
        p[a]++,p[b]++;
    }

    int root=0,w=0,cnt=0;
    for(int i=1;i<=n;i++){
        if(p[i]==0) continue;// 无用的点
        if(p[i]==1) cnt++;// 最外围的点
        else root++;// 表示根节点和第二层的点
    }
    root--;
    w=cnt/root;
    cout<<root<<' '<<w<<endl;
    return ;
}

G. Hits Different


叠罗汉从上到小一定具有性质注意发现和尝试类似前缀和

LL w[N];

void intn(){
    for(int i=1,t=1;;i++)
        for(int j=1;j<=i;j++,t++){
            if(j==1) w[t]=(LL)t*t+w[t-i+1];
            else if(j==i) w[t]=(LL)t*t+w[t-i];
            else w[t]=(LL)t*t+w[t-i]+w[t-i+1]-w[t-2*i+2];
            if(t>N-5) return ;
        }   
}
void solve()
{
    cin>>n;
    cout<<w[n]<<endl;

    return ;
}

H. Don’t Blame Me


dp的状态转移如果是方案数很少的我们就可以用状态机模型然后这个数选择或者是不选择带来的收益即可

int dp[65],d[65];

void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];


    // 可以理解为滚动数组
    memset(dp,0,sizeof dp);
    for(int i=1;i<=n;i++){
        memcpy(d,dp,sizeof dp);// 表示上一个状态的方案
        dp[a[i]]+=1;// 表示当前这个数选择它自己
        for(int j=0;j<=64;j++){// 表示在之前数的基础上选择当前这个数带来的收益是什么
            int x=j&a[i];
            (dp[x]+=d[j])%=mod;
        }
    }
    int ans=0;
    for(int i=0;i<=64;i++)
        if(__builtin_popcount(i)==m) (ans+=dp[i])%=mod;

    cout<<ans<<endl;

    return ;
}

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值