[COCI2015-2016#4] YODA
题目背景
很久很久以前,在一个遥远的星系里,一个巨大的整数碰撞正在发生。
题目描述
当两个整数碰撞时会发生什么?先将数位较少的数前不断添加前导 0 0 0 直到和数位较高的数的数位数量相同为止。然后,从两个数的最低位开始,每次将两个数的对应数位进行比较,并删去较小的那个数位(如果这两个数位相等则不执行任何操作),不断向高数位执行上述操作,直到最高位为止。此时,将这两个数中没有删去的数位按顺序依次拼接,可以得到两个新数。
例如,对于 456328 456328 456328 和 284315 284315 284315 这两个数,这两个的碰撞过程如下所示:
4 4 4 | 5 \sout{~5~} 5 | 6 6 6 | 3 3 3 | 2 2 2 | 8 8 8 |
---|---|---|---|---|---|
2 \sout{~2~} 2 | 8 8 8 | 4 \sout{~4~} 4 | 3 3 3 | 1 \sout{~1~} 1 | 5 \sout{~5~} 5 |
不难看出,碰撞之后得到的两个新数为 46328 46328 46328 和 83 83 83。
现在给定两个数
n
,
m
n,m
n,m,请求出这两个数进行碰撞之后分别得到的新数。如果某个数在进行碰撞之后,其数位都已经被删空了,则在输出中输出一行字符串 YODA
。具体见『输出格式』部分。
输入格式
第一行输入一个整数
n
n
n,表示要进行碰撞的第一个数。
第二行输入一个整数
m
m
m,表示要进行碰撞的第二个数。
输出格式
输出共两行。
第一行中,如果
n
n
n 的数位已经删空,则输出一个字符串 YODA
,否则输出一个整数,表示
n
n
n 进行碰撞后得到的新数。
第二行中,如果
m
m
m 的数位已经删空,则输出一个字符串 YODA
,否则输出一个整数,表示
m
m
m 进行碰撞后得到的新数。
样例 #1
样例输入 #1
300
500
样例输出 #1
0
500
样例 #2
样例输入 #2
65743
9651
样例输出 #2
673
95
样例 #3
样例输入 #3
2341
6785
样例输出 #3
YODA
6785
提示说明
【样例解释 2】
对于样例 2 2 2,这两个数碰撞的过程如下所示:
6 6 6 | 5 \sout{~5~} 5 | 7 7 7 | 4 \sout{~4~} 4 | 3 3 3 |
---|---|---|---|---|
0 \sout{~0~} 0 | 9 9 9 | 6 \sout{~6~} 6 | 5 5 5 | 1 \sout{~1~} 1 |
因此,碰撞之后得到的两个新数分别是 673 673 673 和 95 95 95。
【数据范围】
对于
30
%
30\%
30% 的数据,保证
n
n
n 和
m
m
m 由三位数字组成。
对于所有数据,
1
⩽
n
,
m
⩽
1
0
9
1\leqslant n,m\leqslant 10^9
1⩽n,m⩽109。
【题目来源】
本题来源自 COCI 2015-2016 CONTEST 4 T1 YODA,按照原题数据配置,满分 50 50 50 分。
由 Eason_AC 翻译整理提供。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> a[2];
int main()
{
ll n,m;
cin>>n>>m;
while(n!=0||m!=0)
{
if(n%10>=m%10)
a[0].push_back(n%10);
if(m%10>=n%10)
a[1].push_back(m%10);
n/=10;
m/=10;
}
for(ll i=0;i<=1;i++)
{
if(a[i].empty())
puts("YODA");
else
{
ll out=0;
//将数字转换为数组后
//数组对于原输入数字是逆序的
//所以还需翻转一遍
for(ll j=a[i].size()-1;j>=0;j--)
out=out*10+a[i][j];
cout<<out<<endl;
}
}
return 0;
}