2 条题解

  • 0
    @ 2026-5-18 17:26:01

    这道题让我们求链式四舍五入和普通四舍五入的差异。比如数 44454445 如果用链式四舍五入,那么将会依次变成 4450445045004500500050001000010000,与原来的答案 00 不符。

    发现了什么? 在进行链式四舍五入的时候,较低位上的 55 会对高位造成影响,但是只有在上一位是 44 的时候才会造成影响,比如 44354435 进完位是 44404440 不会造成影响。

    所以考虑四位数中错误的链式舍入,从 4445444549994999 都是不行的。

    按以上思路,预处理出 1010 位数中所有不符合要求的链式舍入。

      int p = 5;
    	f[2] = 5;
    	g[2] = 44;
    	h[2] = 50;
    	for (int i = 3; i <= 10; i++)
    	{
    		p = p * 10 + 5;
    		f[i] = f[i - 1] + p;
    		g[i] = 10 * g[i - 1] + 4;
    		h[i] = h[i - 1] * 10;
    	}
    

    其中数组 ff 是错误链式舍入的个数,数组 gg 是左区间,数组 hh 是右区间。

    比如四位数中错误链式舍入的区间就是 [4445,5000)[4445,5000)

    然后对数所在的区间进行分类讨论。

    	for (int i = 1; i <= t; i++)
    	{
    		cin >> n;
    		string s = to_string(n);
    		int wei = s.length();
    		if (g[wei] <= n && h[wei] <= n)//落在区间右侧
    		{
    			cout << f[wei] << endl;
    		}
    		else if (g[wei] <= n && h[wei] > n)//落在区间中
    		{
    			cout << f[wei - 1] + n - g[wei] << endl;
    		}
    		else//落在区间左侧
    		{
    			cout << f[wei - 1] << endl;
    		}
    	}
    

    完整代码:

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int t, n;
    int f[20];
    int g[20];
    int h[20];
    signed main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin >> t;
    	int p = 5;
    	f[2] = 5;
    	g[2] = 44;
    	h[2] = 50;
    	for (int i = 3; i <= 10; i++)
    	{
    		p = p * 10 + 5;
    		f[i] = f[i - 1] + p;
    		g[i] = 10 * g[i - 1] + 4;
    		h[i] = h[i - 1] * 10;
    	}
    	for (int i = 1; i <= t; i++)
    	{
    		cin >> n;
    		string s = to_string(n);
    		int wei = s.length();
    		if (g[wei] <= n && h[wei] <= n)//落在区间右侧
    		{
    			cout << f[wei] << endl;
    		}
    		else if (g[wei] <= n && h[wei] > n)//落在区间中
    		{
    			cout << f[wei - 1] + n - g[wei] << endl;
    		}
    		else//落在区间左侧
    		{
    			cout << f[wei - 1] << endl;
    		}
    	}
    	return 0;
    }
    

    拒绝抄袭!

    • 0
      @ 2025-10-8 17:12:31
      #include <bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      
      LL isin(LL a, LL b, LL c, LL d) {
          LL L = max(a, c);
          LL R = min(b, d);
          return max(0LL, R - L + 1);
      }
      
      int main() {
          ios::sync_with_stdio(0);
          cin.tie(0);
          cout.tie(0);
          int T;
          cin >> T;
          while (T--) {
              LL n;
              cin >> n;
              LL P = 1, ans = 0;
              LL st = 5, ed = 0;
              while (P * 10 < n) {
                  P *= 10;
                  st += 4 * P;
                  ed = 5 * P - 1;
                  ans += isin(st, ed, 2, n);
              }
              cout << ans << "\n";
          }
          return 0;
      }
      
      • 1

      *【模拟】链式舍入[USACO24DEC] Roundabount Rounding B

      信息

      ID
      6903
      时间
      2000ms
      内存
      256MiB
      难度
      8
      标签
      递交数
      139
      已通过
      25
      上传者