Codeforces Round 954 (Div. 3) D. Mathematical Problem

题目链接: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 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值