题目大意
给定一个字符串,字符串为加减运算表达式,其中的字符由数字
和XdY
组成,其中XdY
代表的是X个Y面的骰子,假定这种骰子是存在的,对于XdY
他的取值可以取到[X,Y∗X][X,Y*X][X,Y∗X],对于给定的字符串,求出他的最大值和最小值,并输出每种骰子有多少个。
思路
模拟题,注意细节。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
string s;
ll ans;
ll ans1, ans2;
map<int, int>cnt;
void print() {
for (auto p : cnt)
{
cout << p.first << ' ' << p.second << endl;
}
cout << ans2 + ans << " " << ans1 + ans;
}
void getan() {
s = "+" + s + "+";
ll num = 0, fff = 0;
bool flag = false;
bool op = true;
for (int i = 0; i < s.size(); i++)
{
auto t = s[i];
if (t == '+' || t == '-')
{
if (!flag)
{
if (op) ans += fff;
else ans -= fff;
fff = 0;
}
else
{
cnt[fff] += num;
if (op)
{
ans1 += num * fff;
ans2 += num;
}
else
{
ans1 -= num;
ans2 -= num * fff;
}
}
fff = 0; num = 0;
flag = false;
if (t == '+') op = true;
else op = false;
}
else if (t == 'd')
{
if (s[i - 1] == '+' || s[i - 1] == '-')
fff = 1;
num = fff;
fff = 0;
flag = true;
}
else
{
fff = fff * 10 + t - '0';
}
}
}
int main()
{
cin >> s;
getan();
print();
return 0;
}