CSP202605A 银行家舍入

CSP202605A 银行家舍入

小 P 的实验表格里有n个形如xxx.x的、保留一位小数的非负实数,其中:

  • 小数点前的xxx表示整数部分a,为任意非负整数;
  • 小数点后的x表示小数部分b,为一位数字,取值0-9
  • a可以是任意位数(如20265310);b必为一位,且当b=0时不会省略(如13.0)。

为方便统计分析,小 P 想将它们都近似为整数,具体定义两种计算方式。

  1. 四舍五入法
  • 当0≤b≤4时,向下舍去,结果为a;
  • 当5≤b≤9时,向上进位,结果为a+1。
  1. 银行家舍入法(向偶数舍入)
  • 当b≠5时,处理与四舍五入法一致(b≤4向下,b≥6向上)。
  • 当b=5时,由于a+0.5与相邻整数a和a+1的距离相同,为避免系统性偏差,向偶数舍入:若a为偶数,则结果为a;否则结果为a+1。

现给出小P表格中的n个实数(格式如上)。对每个实数,分别计算上述两种方法的取整结果。

#include <bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin>>n; int a,b; char dot; vector<int> ans1,ans2; for(int i=0;i<n;i++){ cin>>a>>dot>>b; int a1=b<=4?a:a+1; int a2; if(b!=5) a2=a1; else a2=a%2==0?a:a+1; ans1.push_back(a1); ans2.push_back(a2); } for(int i=0;i<n;i++){ if(i) cout<<" "; cout<<ans1[i]; } cout<<endl; for(int i=0;i<n;i++){ if(i) cout<<" "; cout<<ans2[i]; } return 0; }

这是道很简单的题目,值得注意的点是:

ios::sync_with_stdio(false); cin.tie(nullptr);

关掉cin/coutstdioscanf/printf)的同步,并把cin和它绑定的输出流解绑,让cin/cout跑得跟scanf/printf一样快。
不用scanf/printf是不用写格式符,太麻烦了,这个方法能使用更方便的cin/cout

1.ios::sync_with_stdio(false);

C++ 中为了能混用cin/coutscanf/printf,会把它们绑定到同一套缓冲区,每次 I/O 都要做同步检查,代价很大。这个语句使得cin/cout不再跟scanf/printf同步,速度大幅提升(接近scanf/printf)。
2.cin.tie(nullptr);

cin 和 cout 是"绑定的"——每次执行 cin 之前,会自动调用 cout.flush(),把缓冲区里的东西先输出出去。这个语句解绑cincout,不再每次cin前自动flush