题目链接:https://codeforces.com/problemset/problem/1788/B
给定一个 n, 选取任意满足条件的两个非负整数 x,y 满足如下条件
- x+y=n, and
- x 和 y 的各位数字之和相差至多为 1.
这样的 x 和 y总是存在。
Input
多组测试样例。 第一行包含一个整数 t (1≤t≤10000) 代表测试样例组数.
每组测试样例包含一个整数 n (1≤n≤10^9)
Output
对每组测试样例,输出两个整数 x and y.
如果存在多个答案,输出任意一种.
Sample 1
Input
5
1
161
67
1206
19
Output
1 0
67 94
60 7
1138 68
14 5
Note
第二个样例中, 6767 和 9494 的各位数字之和都是 1313.
第三个样例中, 6060 的各位数字之和是 66, 77 的各位数字之和是 77,相差为 11.
一开始是这样写的(暴力),当时的一个想法从0开始遍历一个一个的找,另外一个用n减去,然后看这两个数满不满足条件,不过超时了
#include<bits/stdc++.h>
using namespace std;
int t;
int main(){
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=0;i<=n;i++){
int r=i;
int m=r;
int sum1=0,sum2=0;
int k=n-r;
int q=k;
while(r){
sum1+=r%10;
r/=10;
}
while(k){
sum2+=k%10;
k/=10;
}
if(sum1==sum2||sum1==sum2+1||sum1+1==sum2){
cout<<m<<" "<<q<<endl;
break;
}
}
}
return 0;
}
想浅浅地分析一下这道题。
解法代码如下:(可以结合上面的分析看看)
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n;
while(n--)
{
string a;
cin>>a;
int sum=0;
for(auto i:a){
sum+=i-'0';
}
int mid=sum/2;
string minstr;
for(int i=a.length()-1;i>=0;i--){
if(mid>a[i]-'0'){
mid-=a[i]-'0';
minstr+=a[i];
a[i]='0';
}else{
minstr+=mid+'0';
a[i]-=mid;
mid-=mid;
}
if(mid==0){
break;
}
}
reverse(minstr.begin(),minstr.end());
cout<<a<<" "<<minstr<<endl;
}
return 0;
}