程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Codeforces 336C Vasily the Bear and Sequence (暴力)

Codeforces 336C Vasily the Bear and Sequence (暴力)

編輯:C++入門知識

Codeforces 336C Vasily the Bear and Sequence (暴力)


題意: 就是現在給出一個嚴格單調遞增的數列a, 1 <= a1 < a2 < a3 ... < an <= 10^9 (1 <= n <= 10^5)
現在要求從中選出一些數作為b1, b2, b3... bm (m為選出的數的個數)

使得 b1 & b2 & b3 ... & bm的二進制末尾0的數量最大, 在滿足這個值最大的同時如果有多個答案, 輸出使得m盡量大的解, 如果依舊有多組解輸出任意一組。

題解:

二進制數最多30位,直接枚舉最高不為0 位,然後又是&運算 有0為0 只需要保證枚舉的當前位置所有為1的全部拿下, 且拿下的數字中,比當前位置小的位在拿下的數字中至少要有一個為0。

代碼:

#include
#include
int value[100005], w[100005];
int main()
{
int n, mark[32], num, coun, date;
while(scanf("%d", &n) != EOF)
{
for(int i = 1; i <= n; i++)
scanf("%d", &value[i]);
for(int i = 30; i >= 0; i--)
{
memset(mark, 0, sizeof(mark));
memset(w, 0, sizeof(w));
num = 0, coun = 0;
for(int j = 1; j <= n; j ++)
{
int k = 1 << (i-1);
if(value[j] & k)
{
int k1 = value[j];
w[coun ++] = value[j], date = 0;
while(k1)
{
int p = k1 % 2;
if(!p && !mark[date] && date < i)
num ++, mark[date] = 1;
date ++, k1 /= 2;
}
}
}
if(num == i-1) break;
}
printf("%d\n", coun);
printf("%d", w[0]);
for(int i = 1; i < coun; i++)
printf(" %d", w[i]);
printf("\n");
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved