Try Again

二数 (埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛)

题目描述

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

输入描述:

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

输出描述:

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

输入

5
42
11
1
2018
13751

输出

42
8
0
2020
8888
所有的数据从第一个奇数开始考虑,若奇数就在最后一位,那么ans[k-1]-- 全部输出。
若在之前,呢么与下一位一起考虑,若为x4的形式,则继续下一位考虑,因为x4-(x-1)4==(x+1)4-x4==6
若下一位小于4,a[pos]--,且之后全为8,若后一位大于4,则ans[pos]++,之后全为0.注意若ans[pos]==9 只能减
同时防止首元素为0.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) (memset(a,0,sizeof(a)))
#define ll long long
char a[100006];
int ans[100006],n,k;
int  solve(int now)
{
    if(ans[now]<4 || (now==k-1 && ans[now]==4)) return 0;
    else if(ans[now]>4) return 1;
    else return solve(now+1);
}
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",&a);
        k=strlen(a);
        for(int i=0;i<k;i++)
            ans[i]=(int)(a[i]-'0');
        int pos=k;
        for(int i=0;i<k;i++)
        {
            if(ans[i]&1){pos=i;break;}
        }
        if(pos==k) printf("%s\n",a);
        else if(pos==k-1)
        {
            for(int i=0;i<k-1;i++)
                printf("%d",ans[i]);
            printf("%d\n",--ans[k-1]);
        }
        else if(ans[pos]==9)
        {
                for(int i=0;i<pos;i++) printf("%d",ans[i]);
                printf("%d",--ans[pos]);
                for(int i=pos+1;i<k;i++) printf("8");
                printf("\n");
        }
        else
        {
            int flag=solve(pos+1);
            if(!flag)
            {
                for(int i=0;i<pos;i++) printf("%d",ans[i]);
                ans[pos]--;
                if(!(!pos && !ans[pos])) printf("%d",ans[pos]);
                for(int i=pos+1;i<k;i++) printf("8");
                printf("\n");
            }
            else
            {
                for(int i=0;i<pos;i++) printf("%d",ans[i]);
                printf("%d",++ans[pos]);
                for(int i=pos+1;i<k;i++) printf("0");
                printf("\n");
            }
        }
    }
    return 0;
}

 

posted @ 2018-04-16 15:04  十年换你一句好久不见  阅读(290)  评论(0编辑  收藏  举报