欢乐赛#54 T6 题解
2025-08-25 19:39:22
发布于:北京
6阅读
0回复
0点赞
主包当时全写成 int 并且不想改了就有了#define int long long
,main()
这样的代码
虽然ACGO支持这样的语法
暴力解法:
枚举每一个 ,把它替换成 并计算乘积,取最小值
计算乘积的算法见注释
#include <bits/stdc++.h>
using namespace std;
#define int long long
int ans=9e18;
//两个1的位置差-1就是中间0的个数
//特判相邻、首尾
int mul(string s){
int last=-1,ans=1,i=0;
//last表示上一个1的位置,用于计算0的个数
//ans表示乘积
//至于初值设定成这样的原因,自己去想(((
for (;i<s.size();i++){
if (s[i]=='0') continue;
ans*=max((int)1,i-last-1);//特判相邻
last=i;
}
ans*=max((int)1,i-last-1);//特判尾
return ans;
//last设成-1的原因就是特判首
}
main(){//请不要学习主包的写法(((
string s;
cin>>s;
for (int i=0;i<s.size();i++){
if (s[i]=='0'){
continue;
}
//把1换成0,注意不能在原字符串上操作
string s1=s;
s1.erase(i,1);
s1.insert(i,1,'0');
ans=min(ans,mul(s1));
}
cout<<ans;
}
这里空空如也
有帮助,赞一个