题干:

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≤10121≤c≤1012)。

输出描述:

对于每一个 c,找到一组 a,b ,使 f(a) + f(b)最大 且 a + b = c,输出这个f(a) + f(b)(0≤a,b≤c0≤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,剩下一个数直接减就行了。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int f(ll x) {
	int res = 0;
	while(x) {
		res += x%10;
		x/=10;
	}
	return res;
}
ll c;
int main()
{
	while(~scanf("%lld",&c)) {
		ll cur = 0;
		while(1) {
			if(cur*10 + 9 > c) break;
			cur =cur*10 + 9  ;
		}
		printf("%d\n",f(cur) + f(c-cur));
	}
	return 0 ;
 }

题干:
 

因为gugugu非常喜欢9这个数字所以他希望把数字n变得末尾有尽可能多的9,不过他只能把n减小,且减小的数值不超过k,因为gugugu太菜了不会做这个题,所以需要你们帮他解答。

输入描述:


 

 

多组数据输入,第一行输入一个整数n代表需要变换的数,和一个整数k代表最大能减少的数值。(1 ≤ n ≤ 1018,0 ≤ k < n)

提示:OJ的测评机使用%lld输出64位整型(即long long).若你写代码的系统为XP,在XP上运行程序测样例时要改成%I64d才能正常输出,但是提交到OJ上的时候必须改回%lld,因为OJ不是xp系统的。

 

输出描述:

输出以最大数量的9在末尾且满足条件的数,如果有多个满足条件请输出最大的一个。

示例1

输入

复制

127 30
4521 89

输出

复制

99
4499

 

解题报告:

  因为题目说的很清楚,是末尾要最多的9,也就是中间断开就不行,所以我们从后往前贪心构造9就行了,注意如果本来就全是9的话那就直接判断下一位。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
ll n,k,ans;
int main()
{
	while(~scanf("%lld%lld",&n,&k)) {
        ans = 0;
		for(ll i = 10; i<=n; i*=10) {
			ll tmp = n%i;//取前几位
			tmp++;
			if(tmp>k) break;
			if(tmp == i) continue;
			ans = tmp;
		}
		printf("%lld\n",n - ans);
	}
	return 0 ;
 }

总结:

注意这两个题的构造区别就是了。