1 条题解
-
0
回溯法
逻辑原理是我们可以先暂时把一个'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
- 1
信息
- ID
- 496
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 31
- 已通过
- 8
- 上传者