题目
题目链接
2019牛客多校9 D题
题解
折半搜索,详见下面的算法推荐和下面的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