牛客練習賽33 C tokitsukaze and Number Game
阿新 • • 發佈:2018-12-15
如果一個數的後三位能被8整除,那麼這個數就能被8整除
首先特判1位和2位的情況
預處理後3位能被8整除的所有情況,排序
找最大的
這個題寫的我簡直想吐,不是這錯就是那錯,不過還好算是敲出來了
#include<stdio.h> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<string.h> #include<queue> #include<stack> #include<list> #include<map> #include<set> #include<vector> using namespace std; typedef long long int ll; const int maxn =100+5; const int maxm=10000; const int mod =1e9+7; const int INF=0x3f3f3f3f; const double eps=1e-8; char s[maxn]; int cnt[15]; int main() { int t;scanf("%d",&t); while(t--) { scanf("%s",s+1);int n=strlen(s+1); if(n==1) { if(s[1]=='0')printf("0\n"); else if(s[1]=='8')printf("8\n"); else printf("-1\n"); } if(n==2) { int a1=(s[1]-'0')*10+s[2]-'0'; int b=(s[2]-'0')*10+s[1]-'0'; if(a1%8)a1=-1;if(b%8)b=-1; printf("%d\n",max(a1,b)); } if(n>=3) { bool flag=false; memset(cnt,0,sizeof(cnt)); string ans=""; for(int i=1;i<=n;i++)cnt[s[i]-'0']++; for(int k=0;k<=999;k+=8) { int a1=k%10,b=k/10%10,c=k/100; cnt[a1]--,cnt[b]--,cnt[c]--; if (cnt[a1]>=0&&cnt[b]>=0&&cnt[c]>=0) { string vis=""; for (int i=9;i>=0;i--) for (int j=1;j<=cnt[i];j++) vis+=i+'0'; flag=true;vis+=c+'0',vis+=b+'0',vis+=a1+'0'; if (vis>ans) ans=vis; } cnt[a1]++,cnt[b]++,cnt[c]++; } if(!flag)printf("-1\n"); else cout<<ans<<endl; } } return 0; }