CF div2

这是一道二进制思维题;

将所有数字列成二进制形式,然后找出最大的一位“1”出现一次的位数;

然后把这个数提到前面,其他照常输出即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+10;
 4 int a[maxn];
 5 int cot[50];
 6 int main()
 7 {
 8     int n;
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++)
11         scanf("%d",&a[i]);
12     for(int i=1;i<=n;i++){
13         int tmp=a[i];
14         int num=0;
15         while(tmp){
16             ++num;
17             if(tmp%2){
18                 cot[num]++;
19             }
20             tmp/=2;
21         }
22     }
23     int tt=40;
24     int biao=0;
25     while(tt){
26         if(cot[tt]==1){
27             biao=tt;
28             break;
29         }
30         tt--;
31     }
32     if(!biao){
33         for(int i=1;i<=n;i++)
34             printf("%d ",a[i]);
35         printf("\n");
36         return 0;
37     }
38     int flag;
39     for(int i=1;i<=n;i++){
40         if((a[i]&(1<<(biao-1)))==(1<<(biao-1))){
41             printf("%d ",a[i]);
42             flag=i;
43             break;
44         }
45     }
46     for(int i=1;i<=n;i++){
47         if(i==flag) continue;
48         printf("%d ",a[i]);
49     }
50     printf("\n");
51     return 0;
52 }

猜你喜欢

转载自www.cnblogs.com/pangbi/p/12289973.html