算法学习记录(模拟枚举贪心题单):四舍五入(未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;
}
posted @ 2023-05-26 13:01  想个昵称好难ABCD  阅读(10)  评论(0编辑  收藏  举报