hi.YODA

[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 1n,m109

【题目来源】

本题来源自 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;
}
  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pretty Boy Fox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值