D. Problem with Random Tests(暴力&贪心)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Problem with Random Tests(暴力&贪心)相关的知识,希望对你有一定的参考价值。

D. Problem with Random Tests(暴力&贪心)

s 1 = s s_1=s s1=s,显然是最优的,因为答案不会更坏。

s 2 s_2 s2 取前缀答案不会更劣。

不如 s ∣ ( 1101 ) , s ∣ ( 0101 ) s|(1101),s|(0101) s(1101),s(0101) s ∣ ( 101 ) s|(101) s(101)好。

因此枚举前缀。

因此我们只需找到第一个0的位置即可。

注意到数据随机,所以前 30 30 30位都为 1 1 1的概率为 1 2 30 \\dfrac12^30 2301很小。所以枚举前30位即可。

时间复杂度: O ( 30 n ) O(30n) O(30n)

#include<iostream>
using namespace std;
int n;
string s;
int main() 
    cin >> n >> s;
    string an = s;
    for(int i = 1; i < 30; i++) 
        string t = s;
        for(int j = i; j < n; j++) t[j] |=  s[j - i];
        if(an < t) an = t;
    
    int st = 0;
    while(st < n - 1 && s[st] == '0') st++;
    cout << an.substr(st) << '\\n';
    return 0;

以上是关于D. Problem with Random Tests(暴力&贪心)的主要内容,如果未能解决你的问题,请参考以下文章

Problem D. Dwarf Tower spfa

D. Fun with Integers

D. Game With Array1400 / 思维 构造

Codeforces Round #520 (Div. 2) D. Fun with Integers

Codeforces Round #270 D. Design Tutorial: Inverse the Problem

Codeforces Round #534 (Div. 2) D. Game with modulo(取余性质+二分)