算法学习记录(模拟枚举贪心题单):四舍五入(未AC)
题目链接
https://ac.nowcoder.com/acm/contest/20960/1004
题目分析
注意当第i位为9是,此时进位就是0,但是0<5
,所以就不能再用i+1
进行判断了。
所以对于这种情况可以再添加一个其他变量。
未AC代码
// 主要解决问题,因为使用i+1去判断是否要进位的
// 逢9进位后就会变成0,那么第i+1位就会变成0,那么也就不满足进位条件
// 所以,需要一个记号去表示,进位。
#include <iostream>
using namespace std;
// 利用第i+1位判断第i位是否要进位
// 用x标记着结束
int n, t, point;
string s;
// 每逢第i位≥5,就将第i位变成y
int main()
{
cin >> n >> t >> s;
for (int i = 0; i < s.size(); ++ i)
{
if (s[i] == '.') point = i; // 只能选择小数点后面的数
if (point && s[i + 1] >= '5') // 如果第i+1位是≥5的
{
int j = i, tmp = false;
for (j = i; j >= 0 && t; -- j)
{
if (s[j] == '.') continue; // 如果第i位是小数点,过滤掉
if (s[j + 1] == '.' && s[j + 2] < '5') break; // 如果第i+1位是小数点,判断第i+2位
// 能来到这,说明,s[i + 2]是≥5的
if (s[j + 1] >= '5' || s[j + 1] == '.' || tmp)
{
if (s[j] == '9') { s[j] = '0', tmp = true; -- t; }
else
{
s[j] ++, -- t;
if (s[j] >= '5' && t);
else break;
}
}
}
// 输出分两种情况
// 1. j的位置 > 小数点的位置
// 2. j的位置 ≤ 小数点的位置
if (j > point)
{
for (int k = 0; k <= j; ++ k)
cout << s[k];
}
else
{
if (tmp) cout << tmp;
for (int k = 0; k < point; ++ k)
cout << s[k];
}
return 0;
}
}
cout << s;
return 0;
}
本文来自博客园,作者:想个昵称好难ABCD,转载请注明原文链接:https://www.cnblogs.com/ClockParadox43/p/17434449.html