链接:https://ac.nowcoder.com/acm/contest/308/C
来源:牛客网
tokitsukaze and Number Game
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
tokitsukaze又在玩3ds上的小游戏了,现在她遇到了难关。
tokitsukaze得到了一个整数x,并被要求使用x的每一位上的数字重新排列,组成一个能被8整除的数,并且这个数尽可能大。
聪明的你们请帮帮可爱的tokitsukaze,如果无法组成被8整除的数,请输出-1。
保证输入不含前导0,输出也不能含前导0。
输入描述:
第一行包括一个正整数T(T<=1000),表示T组数据。
接下来T行,每一行包括一个整数x,(0≤x≤10^100)。
输出描述:
请输出用这些数字组成出能被8整除的最大的数,如果无法组成出能被8整除的数,请输出-1。
示例1
输入
复制
2
666
1256
输出
复制
-1
6512
题意:
思路:
首先应该知道一个规律:
一个数的后三位如果是8的倍数,那么这个数就是8的倍数。
那么我们把数读进来之后,如果长度小于3,特殊处理即可。。
如果长度大于3,
我们先预处理小于1000的所有8的倍数,包括0,然后枚举这些数作为数字的后三位,通过字符数量来判断是否合法,然后从所有情况中取最大值就是答案。
细节见代码:
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include<random>
#include<ctime>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
string S(ll n) {stringstream ss; string s; ss << n; ss >> s; return s;}
ll N(string s) {stringstream ss; ll n; ss << s; ss >> n; return n;}
int num[20];
string str;
std::vector<string> v;
int need[15];
int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\code_stream\\out.txt","w",stdout);
int t;
gbtb;
cin >> t;
string temp;
for (int i = 0; i < 1000; i += 8)
{
temp = S(i);
if (temp.size() == 1)
{
temp = "00" + temp;
} else if (temp.size() == 2)
{
temp = "0" + temp;
}
v.push_back(temp);
}
sort(ALL(v));
while (t--)
{
cin >> str;
MS0(num);
int len = str.length();
for (int i = 0; i < len; ++i)
{
num[str[i] - '0']++;
}
if (len == 1)
{
ll x = N(str);
if (x % 8 == 0)
{
cout << x << endl;
} else
{
cout << -1 << endl;
}
} else if (len == 2)
{
ll x = N(str);
if (x % 8 == 0)
{
reverse(ALL(str));
if (N(str) % 8 == 0)
x = max(x, N(str));
cout << x << endl;
} else
{
reverse(ALL(str));
x = N(str);
if (x % 8 == 0)
{
cout << x << endl;
} else
cout << -1 << endl;
}
} else
{
string ans = "0";
int flag = 1;
for (auto x : v)
{
repd(i, 0, 9)
{
need[i] = 0;
}
for (int i = 0; i < 3; ++i)
{
need[x[i] - '0']++;
}
int tiao = 0;
repd(i, 0, 9)
{
if (num[i] < need[i])
{
tiao = 1;
break;
}
}
if (tiao)
{
continue;
}
repd(i, 0, 9)
{
num[i] -= need[i];
}
flag = 0;
std::vector<char> ans1;
ans1.clear();
repd(i, 0, 9)
{
repd(j, 1, num[i])
{
ans1.push_back((char)(i + '0'));
}
}
sort(ALL(ans1), greater<char>());
string tt = "";
for (auto c : ans1)
{
tt.push_back(c);
}
std::mt19937 generator(time(0));
string y = x;
for (auto c : y)
{
tt.push_back(c);
}
ans = max(ans, tt);
repd(i, 0, 9)
{
num[i] += need[i];
}
}
if (flag)
{
cout << -1 << endl;
} else
{
cout << ans << endl;
}
}
}
return 0;
}
inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}