Contents

折半搜索_算法日常[10/521]

题目

题目链接

2019牛客多校9 D题

https://cdn.jsdelivr.net/gh/wolfdan666/BlogPic/%E7%AE%97%E6%B3%95/2019%E5%B9%B4%E5%A4%9A%E6%A0%A1/%E7%89%9B%E5%AE%A2/%E7%AC%AC%E4%B9%9D%E5%9C%BA/D_ti.png

题解

折半搜索,详见下面的算法推荐和下面的AC的代码

meet-in-middle

AC代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int maxn = 1e6;

struct node {
    ll v;
    int id;
    bool operator < (const node& r) const { return v < r.v; }
}b[maxn];
ll arr[40];
ll a[maxn], c[maxn];
int main() {
    int n; ll sum;
    scanf("%d%lld", &n, &sum);
    for(int i = 0; i < n; i++) scanf("%lld", &arr[i]);
    int x = n/2, y = n-x;
    int up1 = (1<<x), up2 = (1<<y);
    /*全0到全1串的遍历,然后之后是对每个串的逐位遍历,记录此串的和值*/
    for(int i = 0; i < up1; i++) {
        for(int j = 0; j < x; j++) {
            if(i & (1<<j)) a[i] += arr[j];
        }
    }
    for(int i = 0; i < up2; i++) {
        b[i].id = i; b[i].v = 0;
        for(int j = 0; j < y; j++) {
            if(i & (1<<j)) b[i].v += arr[x+j];
        }
    }
    /*让B[i]数组有序,然后使用lower_bound去搜索*/
    sort(b, b+up2);
    for(int i = 0; i < up2; i++) c[i] = b[i].v;
    /*这里复杂度是2^18*log(2^18) = 4.7*10^6左右*/
    for(int i = 0; i < up1; i++) {
        int p = lower_bound(c, c+up2, sum-a[i])-c;
        if(c[p]+a[i] == sum) {
            for(int j = 0; j < x; j++) {
                if(i & (1<<j)) printf("1");
                else printf("0");
            }
            int id = b[p].id;
            for(int j = 0; j < y; j++) {
                if(id & (1<<j)) printf("1");
                else printf("0");
            }
            break;
        }
    }

    return 0;
}

每天叨叨一句

“我不同意你, 但我可以支持你”

李开复原来是学法律的,但他爱好计算机,后来师从美国卡内基梅隆大学计算机学院院长罗杰·瑞迪。

罗杰非常喜欢李开复,把自己的知识毫无保留地传授给李开复,使得他在编程水平突飞猛进。但随着研究的深入,李开复与导师有了分歧,尤其是在计算机语音识别系统研究时,罗杰主张用传统的方法,可是李开复却想从另一个方向,这悖离了主流,有别于大多数语音技术同行。怎么办?导师给李开复指出来了,让他“悬崖勒马”。可是李开复还是想按照自己的想法做。

有不少关系李开复的好心人提醒他:“你在计算机领域还乳臭未干,人家罗杰是美国国家工程学院和美国艺术与科学学院院士,你听导师的,可以少走弯路。”可是李开复却说:“我想另辟溪径。”“可是这样会得罪导师,如果得不到他的支持,你可能寸步难行。你另搞一套,如果成了,让他多没面子。相反你顺从了他,他是总统特别顾问委员会信息委员会成员、‘图灵奖’获得者,有他的提携,将来前途不可限量。”可是那时的李开复没想那么复杂,还是决定走自己的路。

没想到,尽管导师批评了李开复几次,可是李开复一意孤行。罗杰说:**“作为科学家,我也不是全知全能。我不同意你的看法,但我可以支持你。”**这让李开复非常意外。

此后,李开复就放开手脚大干起来。不久,罗杰又来问李开复:“有没有什么困难?”“暂时没有。”“如果有什么需要我帮助的,尽管说啊。”李开复反问道:“你不生我的气啊?”“‘不认同’不等于‘不支持’。”罗杰说。

参考链接

http://blog.sina.com.cn/s/blog_98acb6e70102w95o.html