NC21190. tokitsukaze and Number Game
描述
输入描述
第一行包括一个正整数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; } }