3. 大大大
题目ID:15820必做题100分
最新提交:
Wrong Answer
40 分
历史最高:
Wrong Answer
40 分
时间限制: 1000ms
空间限制: 524288kB
题目描述
题面描述
小J最近迷上了整数四则运算,他也热衷于尽可能大的数值。
小J定义一个整数四则运算式为形如 ??????..????????..?? 的式子,其中 表示 +−∗/+−∗/ 中的一个符号,?? 表示一个 1−91−9 之间的整数。
既然为整数四则运算式,那这个式子按照运算法则(先乘除后加减)算出的结果应当是个整数,不过不可避免的,使用 // 运算时会出现实数,小J并没有强迫症,他只想让最后的结果是整数,中间的过程出现实数他并不在意。
现在,小J把 +−∗/+−∗/ 填入 中,他想知道把 1−91−9 填入 ?? 后这个整数四则运算式,使结果最大的一种方案。
输入格式
从文件 C.in 中读入数据。
一行一个字符串表示符号已经确定的整数四则运算式。
输出格式
输出到文件 C.out 中。
一行一个字符串表示结果最大的整数四则运算式,如果有多种答案,输出任意一种皆可。
样例
?*?+?/?-?
9*9+9/1-1
数据范围
字符串长度 nn 不超过 105105。
测试点编号 | n≤n≤ | 特殊性质 |
---|---|---|
1 | 11 | |
2-5 | 1010 | |
6-8 | 105105 | 算式中只出现 ++ 和 −− 和 ∗∗ |
9-11 | 105105 | 算式中只出现 ++ 和 ∗∗ 和 // |
12-16 | 105105 | 算式中的 // 不超过 99 个 |
17-25 | 105105 | 无特殊性质 |
WA代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100;
string s;
queue<vector<pair<int, int>>> qu[N];
int sum;
bool vis[N];
int a[N];
int main(void)
{
freopen("C.in", "r", stdin);
freopen("C.out", "w", stdout);
cin >> s;
int len = int(s.size());
int cnt = 0;
a[++cnt] = -1;
vis[cnt] = 1;
for (int i = 0; i < len; ++i) {
if (s[i] == '+') {
a[++cnt] = i;
vis[cnt] = 1;
}
if (s[i] == '-') {
a[++cnt] = i;
vis[cnt] = 0;
}
}
a[++cnt] = len;
for (int i = 1; i < cnt; i++) {
if (vis[i]) {
int l = a[i] + 1;
int r = a[i + 1] - 1;
for (int i = l; i <= r; i++) {
if (i > l && s[i - 1] == '/') {
s[i] = '1';
} if (i == l || s[i - 1] == '*') {
s[i] = '9';
}
}
} else {
int l = a[i] + 1;
int r = a[i + 1] - 1;
int sum = 0;
for (int i = l; i <= r; i++) {
if (s[i] == '/') ++sum;
}
if (!sum) {
for (int i = l; i <= r; i++) {
if (s[i] == '?') s[i] = '1';
}
continue;
}
for (int i = l; i <= r; i++) {
if (i == l) {
s[i] = '1';
} if (s[i] == '/') {
s[i + 1] = '9';
} if (s[i] == '*') {
s[i + 1] = '1';
}
}
vector<pair<int, int>> v;
v.push_back(make_pair(l, r));
sum = max(sum, sum);
qu[sum].push(v);
}
}
++sum;
while (sum > 1) {
sum--;
while (qu[sum].size() >= 9) {
vector<pair<int, int>> now;
for (int i = 1; i <= 9; i++) {
for (auto it : qu[sum].front()) {
now.push_back(it);
}
qu[sum].pop();
}
if (sum > 1) {
qu[sum - 1].push(now);
}
}
if ((sum > 1 && qu[sum - 1].empty() && !qu[sum].empty()) ||
qu[sum].size() == 1)
{
while (!qu[sum].empty()) {
for (auto it : qu[sum].front()) {
// int l = it.first;
// int r = it.second;
auto [l, r] = it;
for (int i = l; i <= r; i++) {
if (s[i] == '/' && s[i + 1] == '9') {
s[i + 1] = '1';
break;
}
}
}
if (sum > 1) {
qu[sum - 1].push(qu[sum].front());
}
qu[sum].pop();
}
continue;
}
if (!qu[sum].empty()) {
vector<pair<int, int>> now;
for (auto it : qu[sum].front()) {
s[it.first] = char(10 - qu[sum].size()) + '0';
}
while (!qu[sum].empty()) {
for (auto it : qu[sum].front()) {
now.push_back(it);
}
qu[sum].pop();
}
if (sum > 1) {
qu[sum - 1].push(now);
}
}
}
cout << s << '\n';
return 0;
}