十六届金马五校 I: 二数

链接:https://www.nowcoder.com/acm/contest/91/I
来源:牛客网

我们把十进制下每一位都是偶数的数字叫做“二数”。
小埃表示自己很聪明,最近他不仅能够从小数到大:2,3,4,5....,也学会了从大数到小:100,99,98...,他想知道从一个数开始数最少的数就得到一个二数。但是聪明的小森已经偷偷在心里算好了小埃会数到哪个二数,请你求出他要数到哪个数吧。
换句话说,给定一个十进制下最多105位的数字,请你求出和这个数字的差的绝对值最小的二数,若答案不唯一,输出最小的那个。
也就是说,给定数字n,求出m,使得abs(n-m)最小且m[i] mod 2 = 0

输入描述:

1 ≤ T ≤ 100, 1 ≤ n ≤ 10100000 − 1, T组数据的数字的十进制表示长度总和不超过1000000

输出描述:

每行一个整数 m 第 i 行表示第 i 个数所对应的“最邻近二数”
示例1

输入

5
42
11
1
2018
13751

输出

42
8
0
2020
8888


题解:很显然第一位不是偶数的数要么+1,要么-1,如果为9只能减1,那么问题就是如果判断第一位奇数+1还是-1,我们发现x4444这种数是个分界线,x444变成(x+1)000和(x-1)888结果一样,所以模拟下即可。

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 1E5 + 7;
char s[N];

int main()
{
    int T;
    scanf("%d", &T);
    while(T --) {
        string res;
        scanf("%s", s+1);
        int n = strlen(s+1);
        for(int fg = 0, i = 1;i <= n;i ++) {
            if(!fg) {
                int t = s[i] - '0';
                if(t % 2 == 0) {
                    res += s[i];
                    continue;
                }
                if(t == 9) {
                    fg = 1;
                    res += '8';
                    continue;
                }
                bool ok = 1;
                for(int j = i + 1;j <= n;j ++) {
                    if(s[j] == '4') continue;
                    if(s[j] < '4') break;
                    if(s[j] > '4') {
                        ok = 0; break;
                    }
                }
                if(ok) {
                    res += (s[i] - 1);
                    fg = 1;
                }
                else {
                    res += (s[i] + 1);
                    fg = 2;
                }
            } else {
                if(fg == 1) res += '8';
                else res += '0';
            }
        }
        if((int)res.size() == 1) {
            cout << res << '\n';
        } else {
            int pos = 0;
            if(res[0] == '0') res.erase(res.begin());
            cout << res << endl;
        }
    }
    return 0;
}


阅读更多
个人分类: 贪心 模拟
上一篇十六届金马五校赛 L:DP求最长K倍序列
下一篇第十六届金马五校 二进制找规律F:1 + 2 = 3 ?
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭