题目链接在这里:Problem – L – Codeforces
很显然只用看后两位就行了,我们要让后两位尽量的小并且能被4整除,注意只用看最后两位能被4整除就行了,因为只是两个数,我们对这两个数进行枚举,让这两个数都尽量的小才能保证最后的最大值(把大的数都往前摆)这样的话枚举就应该i从1~9,j从1~i
最后前导零的判断要注意,当0的数量多余1个并且没有其他数的时候如果按照上面的办法会出现前导零。
1 #include "bits/stdc++.h" 2 using namespace std; 3 const int MAX=1e6; 4 int n,t,a[15]; 5 bool flag; 6 int main(){ 7 freopen ("l.in","r",stdin); 8 freopen ("l.out","w",stdout); 9 int i,j,zt,x,y; 10 scanf("%d",&t); 11 n=10; 12 while (t--){ 13 for (i=0;i<n;i++) scanf("%d",a+i); 14 if (a[0]>=2){ 15 j=1; 16 while (a[j]==0 && j<10) j++; 17 if (j==10){ 18 printf("0 "); 19 continue; 20 } 21 } 22 if (a[0]>=2){ 23 for (i=9;i>=0;i--) for (j=1;j<=a[i];j++) putchar(i+'0'); 24 putchar(' ');continue; 25 } 26 flag=false; 27 for (i=1;i<=9;i++) 28 for (j=0;j<=i;j++){ 29 if ((i*10+j)%4!=0 && (j*10+i)%4!=0) continue; 30 if (!a[i] || !a[j]) continue; 31 if (i==j && a[i]<=1) continue; 32 if ((i*10+j)%4==0){ 33 x=i,y=j; 34 flag=true; 35 //cout<<x<<' '<<y<<endl; 36 goto away; 37 } 38 else{ 39 x=j,y=i; 40 flag=true; 41 //cout<<x<<' '<<y<<endl; 42 goto away; 43 } 44 } 45 away:if (flag){ 46 a[x]--,a[y]--; 47 for (i=9;i>=0;i--) for (j=1;j<=a[i];j++) putchar(i+'0'); 48 printf("%d%d ",x,y); 49 continue; 50 } 51 if (a[8]) {printf("8 ");continue;} 52 if (a[4]) {printf("4 ");continue;} 53 if (a[0]) {printf("0 ");continue;} 54 printf("-1 "); 55 } 56 return 0; 57 }