核心算法——ACM模板.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、贪心算法11、区间选点12、区间覆盖13、不相交区间24、哈夫曼编码25、最小值最大化、最大值最小化(二分查找)2二、动态规划71、最长公共子序列(LCS)72、最长上升公共子序列(LIS)93、子段和134、DAG上的动态规划195、区间DP256、状态压缩DP357、双线DP388、背包问题(见背包九讲)41三、数据结构411、并查集412、树状数组433、(字符串)KMP匹配45四、最小生成树算法48Prime核心算法48Kruskal算法53五、单源最短路径57Dijkstra核心算法57Bellman_Ford算法61SPFA算法(Bellman_Ford的队列实现)64六、二分图匹配671、匈牙利算法67七、网络流681、SAP算法682、Dinic算法70贪心算法区间问题区间选点选取尽量少的点覆盖所有的区间,是每个区间至少包含一个点。对区间右端点进行排序。区间覆盖选取尽量少的区间覆盖整个区域。对左端点进行排序。不相交区间选取尽量多的不相交区间。对区间右端点进行排序。哈夫曼编码最小值最大化、最大值最小化(二分查找)NYOJ 疯牛问题(最小值最大化)农夫 John 建造了一座很长的畜栏,它包括N (2 = N = 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 = xi = 1,000,000,000).但是,John的C (2 = C = N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?#include cstdio#include iostream#include algorithmusing namespace std;int n, c;int pos[100005];bool judge(int k){ int cnt = 1; int st = pos[0]; for(int i = 1; i n; ++i) { if(pos[i] - st = k) { ++cnt; if(cnt = c) return true; st = pos[i]; } } return false;}int Binary_search(int left, int right) /// 二分枚举满足条件的最大距离{ while(left = right) { int mid = (left + right) 1; if(judge(mid)) /// 所求距离 = mid,可以继续增大试探 left = mid+1; else /// 所求距离 mid,所以必须减小来试探 right = mid-1; } return left-1;}int main(){ while(~scanf(%d%d, n, c)) { for(int i = 0; i n; ++i) scanf(%d, pos[i]); sort(pos, pos+n); printf(%d\n, Binary_search(0, pos[n-1] - pos[0])); } return 0;}NYOJ 摘枇杷(最大值最小化)理工学院的枇杷快熟了,ok,大家都懂得。而且大家都知道,学校的枇杷树都是一列一列的。现在小Y同学已经在筹划怎么摘枇杷了。现在我们假设有一列枇杷树,而且每棵枇杷树上枇杷果的数量小Y都已经知道了。假设现在有n棵枇杷树,小Y可以把这n棵枇杷树分成m组,每组枇杷果的数量是这组内每棵枇杷树上枇杷果数量的和。注意,每组的枇杷树必须是连续的。(每组最少1棵树,最多n棵树)。小Y把枇杷往寝室拿的时候是一组一组拿的,所花费的力气等于这m组中枇杷果最多的那组枇杷果的数量。现在小Y想花尽量少的力气把这些枇杷果拿回寝室。#include stdio.h#include string.hint n, m, a[1005];bool judge(int x){int s=0,count=0;for(int i=0; in; i++) { if(s+a[i]x) { count++; s=a[i]; if(countm-1) ///当count==m时,而in, 则当每次运送x时,m组内运不完 return false; } else s += a[i]; }return true;///每次运送x时,m组内就能运完}int Binary_search(int l, int r){while(l=r){int mid = (l+r)/2;if(judge(mid)) r = mid-1;else l = mid+1;}return l;///当从while中退出时,最后

文档评论(0)

2266670 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档