Codeforces Round #613 (Div. 2) D. Dr. Evil Underscores

題意:

給你一些數, 找一個數x, 使得與所有數的亦或最大的那個值 最小 x

思路:

亦或的話, 肯定是位數是從大到小來枚舉, 如果所有的數中,當前位上的值是一樣的,那麼 x 在這個位上就一定是 0, 如果這個位既有0也有1, 那麼就要分兩種情況來考慮,填 1 會怎麼樣, 填 0 會怎麼樣,然後把數分成兩撥,一波是當前位是1 的, 一波是當前位是0的。 然後不斷遞歸下去。 所以dfs 轉移的時候,還是要用 vector 記錄當前狀態下有什麼樣的數字。

反思:

一開始做的時候, 想到了這種算法, 但是覺得時間複雜度過不去, 就沒有寫,當我看了別人寫的, 我還是沒有懂時間複雜度是怎麼算的。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+100;
int n,x;
vector<int> v;
int dfs(vector<int> v, int bit){
    if (v.size() == 0 || bit < 0) return 0;
    vector<int>v0, v1;
    for (auto it: v){
        if ((it >> bit) & 1) v1.push_back(it); else v0.push_back(it);
    } 
    if (v0.size() == 0) return dfs(v1, bit-1);
    if (v1.size() == 0) return dfs(v0, bit - 1);
    return min(dfs(v0, bit - 1), dfs(v1, bit - 1)) + (1 << bit);
};
int main(){
    scanf("%d",&n);
    for (int i =0; i < n; ++i){
        scanf("%d",&x);
        v.push_back(x);
    }
    int ans = dfs(v, 30);
    printf("%d\n",ans);
    return 0;
}
發佈了237 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章