列表

详情


NC21190. tokitsukaze and Number Game

描述

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 19ms, 内存消耗: 472K, 提交时间: 2018-12-10 00:17:49

#include <bits/stdc++.h>
using namespace std;
int cnt[11];char num[110];
int main() {
    int T;scanf("%d",&T);
    while (T--) {
        scanf("%s",num+1);int n=strlen(num+1);
        if (n==1) {
            if (num[1]=='0') printf("0\n");
            else if (num[1]=='8') printf("8\n");
            else printf("-1\n");
            continue;
        }
        if (n==2) {
            int a=(num[1]-'0')*10+num[2]-'0',b=(num[2]-'0')*10+num[1]-'0';
            if (a%8) a=-1;if (b%8) b=-1;
            printf("%d\n",max(a,b));continue;
        }
        memset(cnt,0,sizeof(cnt));
        for (int i=1;i<=n;i++) cnt[num[i]-'0']++;
        bool flag=false;string ans="";
        for (int s=0;s<=999;s+=8) {
            int a=s%10,b=s/10%10,c=s/100;
            cnt[a]--,cnt[b]--,cnt[c]--;
            if (cnt[a]>=0&&cnt[b]>=0&&cnt[c]>=0) {
                string del="";
                for (int i=9;i>=0;i--)
                    for (int j=1;j<=cnt[i];j++) del+=i+'0';
                flag=true;del+=c+'0',del+=b+'0',del+=a+'0';
                if (del>ans) ans=del;
            }
            cnt[a]++,cnt[b]++,cnt[c]++;
        }
        if (!flag) printf("-1\n");
        else cout<<ans<<endl;
    }
}

Python(2.7.3) 解法, 执行用时: 716ms, 内存消耗: 3544K, 提交时间: 2018-12-08 08:13:24

cnt = [0] * 15

def fenjie(a):
	while (a):
		cnt[a % 10] += 1
		a /= 10		

def work():
	for i in range(0, 10): cnt[i] = 0
	ans = -1
	a = input()
	if (a == 8 or a == 0):print(a);return 
	if (a <= 10):print(-1);return 
	if (a <= 100 and a % 8 == 0):print(a);return 
	if (a < 100):
		x = a % 10;a = a / 10;y = a % 10;a = a / 10;tmp = x * 10 + y
		if (tmp % 8 == 0):print(tmp);return 
	
	
	fenjie(a)
	
	weishu = 0
	for i in range(0, 10): weishu += cnt[i]
	
	for i in range(0, 1000, 8):
		t = i;x = t % 10;t = t / 10;y = t % 10;t = t / 10;z = t % 10;t = t / 10
		
		cnt[x] -= 1;cnt[y] -= 1;cnt[z] -= 1
		
		flag = 0
		for j in range(1, 10):
			if (cnt[j] > 0): flag = 1
		if (weishu == 3):flag = 1
		
		if (cnt[x] < 0 or cnt[y] < 0 or cnt[z] < 0 or flag == 0): 
			cnt[x] += 1;cnt[y] += 1;cnt[z] += 1;continue
		
		now = 0
		for j in range(9, -1, -1):
			for k in range(1, cnt[j] + 1):
				now = now * 10 + j
		now = now * 1000 + i
		if (now > ans): ans = now
		
		cnt[x] += 1;cnt[y] += 1;cnt[z] += 1
		
	print(ans)



n = input()
for i in range(1, n + 1):
	work()
	
	
	
	
	

C++11(clang++ 3.9) 解法, 执行用时: 21ms, 内存消耗: 504K, 提交时间: 2018-12-07 19:23:18

#include <bits/stdc++.h>
using namespace std;
int cnt[11];char num[110];
int main() {
	int T;scanf("%d",&T);
	while (T--) {
		scanf("%s",num+1);int n=strlen(num+1);
		if (n==1) {
			if (num[1]=='0') printf("0\n");
			else if (num[1]=='8') printf("8\n");
			else printf("-1\n");
			continue;
		}
		if (n==2) {
			int a=(num[1]-'0')*10+num[2]-'0',b=(num[2]-'0')*10+num[1]-'0';
			if (a%8) a=-1;if (b%8) b=-1;
			printf("%d\n",max(a,b));continue;
		}
		memset(cnt,0,sizeof(cnt));
		for (int i=1;i<=n;i++) cnt[num[i]-'0']++;
		bool flag=false;string ans="";
		for (int s=0;s<=999;s+=8) {
			int a=s%10,b=s/10%10,c=s/100;
			cnt[a]--,cnt[b]--,cnt[c]--;
			if (cnt[a]>=0&&cnt[b]>=0&&cnt[c]>=0) {
				string del="";
				for (int i=9;i>=0;i--) 
					for (int j=1;j<=cnt[i];j++) del+=i+'0';
				flag=true;del+=c+'0',del+=b+'0',del+=a+'0';
				if (del>ans) ans=del;
			}
			cnt[a]++,cnt[b]++,cnt[c]++;
		}
		if (!flag) printf("-1\n");
		else cout<<ans<<endl;
	}
}

上一题