intmain() { cin >> a >> b >> n; week = 5 * a + 2 * b; ans = n / week * 7; n %= week; if (a * 5 >= n) ans += n / a + (n % a > 0); elseif (a * 5 + b >= n) ans += 6; else ans += 7; cout << ans << endl; return0; }
C 整数变换
Solution-1
洛谷 AC,蓝桥杯赛场上不能满分。
对于正整数 n,nmod10 为 n 的最后一位。对 n 多次对 10 取余并除以 10,即可算出 n 各数位之和。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<bits/stdc++.h> usingnamespace std;
int n, ans;
intmain() { cin >> n; while (n && ++ans) { int num = n, sum = 0; while (num) { sum += num % 10; num /= 10; } n -= sum; } cout << ans << endl; return0; }
Solution-2
赛场上 AC。
注意到每一次减去的数不会超过 9×8=72,因此 n 在大多数情况下都是末几位在变动。考虑预处理。
设 ai,j 为一个数末四位为 j,其余数位之和为 i 时,需要操作多少次才能让第五位变动。bi,j 表示一个数末四位为 j,其余数位之和为 i 时,使得第五位变动的第一次操作后,末四位的值。
用循环暴力计算即可预处理出 a、b 数组。
计算 n 的答案时,计算它的 i 和 j,答案加上 ai,j,更新 n=n/1000−1+bi,j 即可。
n = int(input()) a = [[0for _ inrange(105)] for _ inrange(10010)] b = [[0for _ inrange(105)] for _ inrange(10010)] ans = 0 for i inrange(1, 1001): for j inrange(0, 80): num, cnt = i, 0 while num: res, sum = num, 0 while res: sum += res % 10 res //= 10 num -= sum + j cnt += 1 if num <= 0: a[i][j] = cnt b[i][j] = num break while n: if n < 1000: ans += a[n][0] break x = n % 1000 if x == 0: res, sum = n, 0 while res: sum += res % 10 res //= 10 n -= sum ans += 1 continue y = n // 1000 z = 0 while y: z += y % 10 y //= 10 ans += a[x][z] n = n - x + b[x][z] print(ans)