• Codeforces 336C


    这题是大一暑假时候做的,当时没有出,直到今天突然觉得应该把没过的题目再做一边,不然真的是越积越多。

    现在能够独立做出来真的是难以表达的兴奋,刚开始的时候就觉得 O(30 * 30 * n)的复杂度有点不安全,不过还是敲了,事实说明实际的负责度没这么高。和去年一样,没有思路,后来仔细一想,真的是数学题。现在感觉爱上了Math...


    附上代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 // 保存原始数组
     5 int b[100005];
     6 // a[i][j]表示b[i]的二进制表示法中的各个位上的数值, 而able数组保存的是每一轮中可以选的标记
     7 bool a[100005][32], able[100005];
     8 int n;
     9 
    10 int main(void) {
    11     while (~scanf("%d", &n) && n) {
    12         memset(a, false, sizeof(a));
    13         for (int i = 0; i < n; i++) {
    14             int x;
    15             scanf("%d", &x);
    16             b[i] = x;
    17             for (int j = 30; j >= 0; j--) {
    18                 if ((1 << j) & x)
    19                     a[i][30-j] = true;
    20             }
    21         }
    22 
    23         int cnt;
    24         for (int i = 0; i <= 30; i++) {
    25             cnt = 0;
    26             memset(able, false, sizeof(able));
    27             for (int j = 0; j < n; j++) {
    28                 if ( a[j][i] ) {
    29                     able[j] = true;
    30                     cnt++;
    31                 }
    32             }
    33             if (cnt == 0) continue;
    34 
    35             int j;
    36             for (j = i + 1; j <= 30; j++) {
    37                 int f = 0;
    38                 for (int k = 0; k < n; k++) {
    39                     if ( able[k] ) {
    40                         if ( !a[k][j] ) {
    41                             f = 1;
    42                             break;
    43                         }
    44                     }
    45                 }
    46                 if (f == 0)
    47                     break;
    48             }
    49             if (j > 30)
    50                 break;
    51         }
    52         printf("%d
    ", cnt);
    53         int flag = 0;
    54         for (int i = 0; i < n; i++) {
    55             if ( able[i] ) {
    56                 if (flag) 
    57                     printf(" ");
    58                 flag = 1;
    59                 printf("%d", b[i]);
    60             }
    61         }
    62         puts("");
    63     }
    64 
    65     return 0;
    66 }


  • 相关阅读:
    第五次作业
    第四次作业
    Java实验二
    java第一次作业
    第十一次作业
    第十次作业
    第九次作业
    第八次作业
    第七次作业
    第六次作业
  • 原文地址:https://www.cnblogs.com/Stomach-ache/p/3703245.html
Copyright © 2020-2023  润新知