
题解:
#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <cmath>
#include <sstream>
using namespace std;
struct State {
int int_part;
vector<char> decimals;
};
double calculateValue(const State& s) {
double val = s.int_part;
double factor = 0.1;
for (char c : s.decimals) {
val += (c - '0') * factor;
factor /= 10;
}
return val;
}
string formatOutput(double value) {
ostringstream oss;
if (value == floor(value)) {
oss << static_cast<long long>(value);
} else {
oss << value;
string s = oss.str();
size_t dot_pos = s.find('.');
if (dot_pos != string::npos) {
size_t last_non_zero = s.find_last_not_of('0');
if (last_non_zero == dot_pos) {
s = s.substr(0, dot_pos);
} else if (last_non_zero != string::npos) {
s = s.substr(0, last_non_zero + 1);
}
}
return s;
}
return oss.str();
}
int main() {
string s;
cin >> s;
int int_part = 0;
vector<char> decimals;
size_t dot_pos = s.find('.');
if (dot_pos != string::npos) {
int_part = stoi(s.substr(0, dot_pos));
string dec_part = s.substr(dot_pos + 1);
for (char c : dec_part) {
decimals.push_back(c);
}
} else {
int_part = stoi(s);
}
double max_val = calculateValue({int_part, decimals});
queue<State> q;
q.push({int_part, decimals});
while (!q.empty()) {
State current = q.front();
q.pop();
int len = current.decimals.size();
for (int i = 1; i <= len - 1; ++i) { // 检查第i+1位(索引i)
if (current.decimals[i] < '5') continue;
vector<char> new_decimals(current.decimals.begin(), current.decimals.begin() + i);
int new_int = current.int_part;
int carry = 1;
// 处理进位
for (int k = new_decimals.size() - 1; k >= 0; --k) {
int digit = new_decimals[k] - '0';
digit += carry;
carry = digit / 10;
new_decimals[k] = (digit % 10) + '0';
if (carry == 0) break;
}
if (carry > 0) {
new_int += carry;
new_decimals.clear();
}
// 检查是否需要进一步进位到整数部分
if (!new_decimals.empty()) {
double decimal_val = 0.0;
double factor = 0.1;
for (char c : new_decimals) {
decimal_val += (c - '0') * factor;
factor /= 10;
}
if (decimal_val >= 0.5) {
new_int += 1;
new_decimals.clear();
}
}
// 计算新值
double new_value = new_int;
if (!new_decimals.empty()) {
new_value = calculateValue({new_int, new_decimals});
}
if (new_value > max_val) {
max_val = new_value;
}
// 若仍有小数部分,继续处理
if (!new_decimals.empty()) {
q.push({new_int, new_decimals});
}
}
}
cout << formatOutput(max_val) << endl;
return 0;
}