题目
题目链接
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); 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]; } } sort(b, b+up2); for(int i = 0; i < up2; i++) c[i] = b[i].v; 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