2 条题解
-
0
这道题让我们求链式四舍五入和普通四舍五入的差异。比如数 如果用链式四舍五入,那么将会依次变成 和 和 和 ,与原来的答案 不符。
发现了什么? 在进行链式四舍五入的时候,较低位上的 会对高位造成影响,但是只有在上一位是 的时候才会造成影响,比如 进完位是 不会造成影响。
所以考虑四位数中错误的链式舍入,从 到 都是不行的。
按以上思路,预处理出 位数中所有不符合要求的链式舍入。
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; } }完整代码:
#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
#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
信息
- ID
- 6903
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 139
- 已通过
- 25
- 上传者