1 条题解

  • 0
    @ 2025-9-21 22:28:41

    回溯法

    逻辑原理是我们可以先暂时把一个'1'变为'0',然后重新遍历一遍0,得到一个结果,完成此次之后,再变回去。

    c

    #include <stdio.h>
    #include <string.h>
    #include <limits.h>
    
    void eachT() {
        char s[10001];  // 存储输入的01串
        scanf("%s", s);
        int len = strlen(s);
        long long ans = LLONG_MAX;  // 初始化最小值为最大可能值
        
        for (int i = 0; i < len; ++i) {
            if (s[i] == '1') {  // 只处理'1'的位置
                // 临时翻转当前'1'为'0'
                s[i] = '0';
                
                long long t = 1;
                int cnt = 0;
                for (int j = 0; j < len; ++j) {
                    if (s[j] == '0') {
                        cnt++;  // 累计连续0的个数
                    } else if (cnt > 0) {
                        // 遇到'1'且有累计的0,相乘并重置计数
                        t *= cnt;
                        cnt = 0;
                    }
                }
                // 处理字符串末尾的连续0
                if (cnt > 0) {
                    t *= cnt;
                }
                
                // 更新最小值
                if (t < ans) {
                    ans = t;
                }
                
                // 恢复原字符
                s[i] = '1';
            }
        }
        
        printf("%lld\n", ans);
    }
    
    int main() {
        eachT();
        return 0;
    }
    

    cpp

    #include<bits/stdc++.h>
    using namespace std;
    #define endl '\n'
    #define ll long long
    
    // const int N=1e6+10;
    
    void eachT() {
        string s; cin>>s;
        ll ans=LLONG_MAX;
        for(int i=0;i<s.size();++i){
            //假设当前位置'1'可翻转
            if(s[i]=='1'){
                s[i]='0'; //暂时变成0,回头再变1
    
                ll t=1,cnt=0;
                for(char ch:s){
                    if(ch=='0') cnt++; // 对0计数
                    else if(cnt){// 两个1之间的数量cnt乘到t  注意cnt可能为0
                        t*=cnt;
                        cnt=0; //重置
                    } 
                }
                // 针对末尾出现的“1000”这种类似情况,此时cnt=3,也需要计入
                if(cnt) t*=cnt;
    
                ans=min(ans,t);
    
                s[i]='1';
            }
        }
        cout<<ans;
    }
    
    signed main(){
        ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        int _=1;
        // cin>>_;
        while (_--) eachT();
    }
    

    py

    全超时辣,不会py

    信息

    ID
    496
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    31
    已通过
    8
    上传者