算法学习记录(模拟枚举贪心题单):四舍五入(未AC)

发布时间 2023-05-26 13:08:02作者: 想个昵称好难ABCD

题目链接

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位是否要进位
int n, t, flag, point;
string s;

int main()
{
    cin >> n >> t >> s;
    for (int i = 0; i < s.size(); ++ i)
    {
        if (s[i] == '.') { point = i; flag = true; }     // 只能选择小数点后面的数
        if (flag && 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;
}