题目链接:https://codeforces.com/contest/1986/problem/D
写在前面
题目看起来不难,我是先考虑0和1的特殊情况,除了n等于2和3的情况下,其他情况遇到0则最小值就是0,遇到1则可以考虑不看,加法优先度大于乘法,想到这思路基本上都有了,但主要是我发现我不会写······,只好看别人的代码借鉴一下思路了···
题意
给定n长度的字符串,在字符串中插入n-2个符号(只能是 + or *),使插入符号后的表达式为最小,并输出这个值
思路
分为3种情况
- n=2 :这时候不能插入符号,只需要判断s[0]是否为0,前置0不输出
- n=3:n为3且s[1]为0,这时候只需要比较 s[0]+s[2] 与 s[0]s[2] 即可
- 先特判字符串s中是否含有0,若有则直接输出0;我们遍历字符串s,将不为1的数字全部加起来(因为含有1的话可以通过乘以1消去,这里先不考虑1的情况),这时候我们只需要考虑字符串s中连续2个字符即可(因为插入的是n-2个符号,那么必然有2个字符是连在一块的),遍历字符串s,找出连续2个字符所加起来的和最小的那一对即可
编程
void solve(){
int n;cin >> n;
string s;cin >> s;
if(n==2){
if(s[0]=='0') cout << s[1] << endl;
else cout << s << endl;
return ;
}
if(n==3 && s[1]=='0'){
int k1=(s[0]-'0')+(s[2]-'0');
int k2=(s[0]-'0')*(s[2]-'0');
cout << min(k1,k2) << endl;
return ;
}
if(s.find('0')!=-1){
cout << 0 << endl;
return ;
}
int sum=0;
for(auto i : s){
if(i!='1') sum+=(i-'0');
}
int ans=1e18;
for(int i=0;i<n-1;++i){
int x=stoi(s.substr(i,2));//stoi将字符串转换为int类型
int y=sum;
if(s[i]!='1') y-=(s[i]-'0');//不为1减去当前数字
if(s[i+1]!='1') y-=(s[i+1]-'0');
ans=min(ans,x+y);//比较最小值
}
cout << ans << endl;
return ;
}