CF 1986D. Mathematical Problem

原题链接: Problem - 1986D - Codeforces

**题意:**一串长度最多为20的由数字组成的字符串,在这些数字中间可以添加字符串长度减去二数量的符号,加或者乘,例如1234,就可以添加加号或者乘号二个,变成1+2*34,1*2*34,12+2*3等等,求算出来的最小值。

**思路:**观察可以得到,对于每个字符串,都会有一个数字由二个字符组成,并且这二个字符为相邻字符,所以可以枚举这个数字的位置,然后求出每次的最小值,然后取最小。

cpp 复制代码
//冷静,冷静,冷静
//调不出来就重构
#pragma GCC optimize(2)
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=998244353;
ll n;string s;
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	ll t;cin>>t;
	while(t--)
	{
		cin>>n;
		cin>>s;
		ll k=n-2;
		if(k<=0)
		{
			bool l=0;
			for(int i=0;i<s.size();i++)
			{
				if(s[i]!='0')l=1;
                if(i==s.size()-1)l=1;
				if(l)cout<<s[i];
			}
			cout<<endl;
			continue;
		}
		map<ll,ll> op;
		for(int i=0;i<s.size();i++)
		{
			op[s[i]-'0']++;
		}
		ll min1=1e18;
		for(int i=0;i+1<s.size();i++)
		{
			ll sum=1e18;//因为sum可能变成0
			ll zhi=(s[i]-'0')*10+s[i+1]-'0';
			op[s[i]-'0']--;op[s[i+1]-'0']--;
			op[zhi]++;
			for(auto v:op)
			{
				for(int j=0;j<v.second;j++)
				{
					if(sum==1e18)
					{
						sum=v.first;
					}
					else
					{
						sum=min(sum+v.first,sum*v.first);
					}
				}
			}
			min1=min(min1,sum);
			op[zhi]--;
			op[s[i]-'0']++;op[s[i+1]-'0']++;
		}
		cout<<min1<<endl;
	}
    return 0;
}
相关推荐
じ☆冷颜〃3 分钟前
Picard–Lindelöf定理在CS中的应用:理论框架与算法基础
人工智能·经验分享·笔记·算法·机器学习
不知名的老吴8 分钟前
机器学习评价之基础指标
人工智能·算法·机器学习
Felven8 分钟前
D. Divisible Pairs
算法
源代码杀手9 分钟前
基于ROS2+Gazebo+RIVE的40项计算机视觉前沿机器人项目(含视觉算法原理与源码获取方式)
算法·计算机视觉·机器人
MrZhao40010 分钟前
大模型量化到底在做什么:从浮点数表示到 Qwen FP8 实践
算法
JieE21211 分钟前
LeetCode35. 搜索插入位置:二分查找的基础与细节
javascript·算法
8Qi817 分钟前
LeetCode 188 & 123:股票买卖问题(限制交易次数)—— 联合题解
算法·leetcode·职场和发展·动态规划
KaMeidebaby20 分钟前
卡梅德生物技术快报|细胞周期检测抗原流式分析:参数调试、软件拟合与问题排查
网络·人工智能·python·网络协议·tcp/ip·算法·机器学习
一只齐刘海的猫25 分钟前
【Leetcode】三数之和
数据结构·算法·leetcode
lightqjx25 分钟前
【算法】数据结构_扩展域并查集
数据结构·算法·并查集·扩展域并查集