链接:https://ac.nowcoder.com/acm/contest/318/G
来源:牛客网
题目描述
LLLYYY很喜欢写暴力模拟贪心思维。某一天在机房,他突然抛给了队友ppq一
个问题。问题如下:
有一个函数f ():
int f(int x){
int tmp = 0;
while(x != 0){
tmp += x % 10;
x /= 10;
}
return tmp;
}
接着LLLYYY给定一个整数 c,要求在c范围内找两个整数a和b,使得a + b = c,且f(a) + f(b)的值最大。
输入描述:
采用多组输入方式。
每行输入一个整数 c (1≤c≤1012)。
输出描述:
对于每一个 c,找到一组 a,b ,使 f(a) + f(b)最大 且 a + b = c,输出这个f(a) + f(b)(0≤a,b≤c)。
示例1
输入
复制
35
10000000000
输出
复制
17
91
说明
在第一个样例中,可以选择 a = 17,b = 18,这样得到的f(a) + f(b)值最大为 17。
在第二个样例中, 可以选择 a = 5000000001,b = 4999999999.这样得到的f(a) + f(b)值最大为 91。
试了很多种方法,然后考虑到要使值越大,数字9越多值越大
#include <stdio.h>
typedef long long ll;
ll f(ll x) {
ll sum = 0;
while (x) {
sum += x%10;
x /= 10;
}
return sum;
}
int main() {
ll t;
while (~scanf("%lld", &t)) {
// 109 99 + 10
ll len = 0, k = t, sum = 0, s = 0;
while (k) {
k /= 10;
len++;
}
len--;
while (len--) {
s = s * 10 + 9;
sum += 9;
}
printf("%lld\n", f(t-s)+sum);
}
return 0;
}