CF1857B 题解

洛谷传送门 & CF 传送门

思路

这题可以用贪心做,倒着遍历,看这一位上的数字是否 5\ge5,如果是的,那就直接四舍五入。

注意事项

  1. 倒着遍历;
  2. 每次处理时不能直接把 1i1\sim i 清零,而应该记录一个 lastlast 标记,在输出的时候处理即可;
  3. 处理时注意进位;
  4. 注意有时候最高位还能进位,这种情况特殊处理。

代码

# include <bits/stdc++.h> //万能头
using namespace std;
int t, last;
string a;
int main () {
	cin >> t;
	while (t --) { //多组数据通用写法
		cin >> a;
		last = a.size (); //多组数据要清空
		for (int i = a.size (); -- i;)
			if (a[i] > '9') //判断当前是否需要进位
				a[i] = '0', ++ a[i - 1];
			else if (a[i] > '4') { //判断当前是否可以五入
				last = i; //记录下来
				++ a[i - 1]; //下一位 +1
			}
		if (a[0] > '4') { //最高位是否可以五入或需要进位
			cout << 1;
			for (int i = 0; i < a.size (); ++ i)
				cout << 0;
		} else {
			for (int i = 0; i < last; ++ i)
				cout << a[i]; //前面部分正常输出
			for (int i = last; i < a.size (); ++ i)
				cout << 0; //后面部分全变 0
		}
		cout << '\n'; //别忘了换行
	}
	return 0; //结束程序
}
posted @ 2023-08-08 13:57  Vitamin_B  阅读(9)  评论(0)    收藏  举报  来源