本文主要是介绍题目:迷失之地(蓝桥OJ 3332),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述:
解题思路:
先找到最大的数,因为他的位是最大的。
再找前面含缺零位为的最大数,依次类推,直到没有0位或早不到能补零的位。
题解:
#include<bits/stdc++.h>
using namespace std;const int N = 1e6 + 10;
int q[N], st[N];
int n, maxn, id;int main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n;for(int i = 1; i <= n; i ++){cin >> q[i];if(q[i] > maxn)maxn = q[i],id = i;} cout << q[id] << ' ';st[id] = 1;int ans = maxn;while(1){ // 找到每次需要的值直接输出然后标记,使得两层枚举变简单**int maxv = -1, id = 0; // 每次都会重置***for(int i = 1; i <= n; i++){if(st[i])continue;if((q[i] | ans) - ans > maxv){maxv = (q[i] | ans) - ans;id = i;}}if(maxv == 0 || maxv == -1)break; // 注意出口:当找不到cout << q[id] << ' ';ans |= q[id];st[id] = 1;}for(int i = 1; i <= n; i++){ // 按顺序提取出剩下的不需要的 if(!st[i]){cout << q[i] << ' ';}}return 0;
}
知识点:二进制位,思维
这篇关于题目:迷失之地(蓝桥OJ 3332)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!