- 1、本文档共79页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
提高组班讲座位运算及其应用ppt课件
例题六:最小表示(graph.*,1秒,256M) 时间复杂度难以承受? 例题六:最小表示(graph.*,1秒,256M) 时间复杂度难以承受? 位运算 C++有个stl叫bitset! 例题六:最小表示(graph.*,1秒,256M) #includebitset #define N 30010 using namespace std; bitsetNbit[N]; void solve(){ 求出所有点的拓扑序; for(int i=t;i=1;i--){//按拓扑序从大到小遍历每个点 将该点指向的所有点按拓扑序从小到大排序; for(int j=1;j=num;j++){ int y=a[j].en; //依次取出每个点 if(bit[u][y])ans++; bit[u]|=bit[y]; } } } 上机题目:拔河比赛(competition.*,1秒,256M) 问题描述 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,且两个组内的所有人体重加起来尽可能地接近。 输入格式 数据的第1行是一个n,表示参加拔河比赛的总人数,接下来的n行表示第1到第n个人的体重,每个人的体重weight都是整数。 输出格式 包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数不相等,则请把小的放在前面输出。 上机题目:拔河比赛(competition.*,1秒,256M) 样例输入 3 100 90 200 样例输出 190 200 数据范围 60%的数据保证 n=100,1=weight=500。 100%的数据保证 n=500,1=weight=1000。 上机题目:拔河比赛(competition.*,1秒,256M) 动态规划的转移方程式: 令F[i][j]表示前i个人,选出体重为j是否可能 F[i][j]=F[i-1][j] or F[i-1][j-Weight[i]] 时间复杂度为 上机题目:拔河比赛(competition.*,1秒,256M) 动态规划的转移方程式: F[i][j]=F[i-1][j] or F[i-1][j-Weight[i]] 如何优化? bitset! 上机题目:拔河比赛(competition.*,1秒,256M) bitset501000 H; int main(){ cinn; H[0]=true; for(int i=1;i=n;i++){ cinx;s+=x;H=H|(Hx); } int x=0; for(int i=1;i=s;i++)if(H[i]i=s-i)x=i; coutx s-xendl; } 上机题目:黑客的攻击(Hacker.*,1秒,256M) 问题描述 假设你是一个黑客,入侵了一个有着n台计算机(编号为0,1,...,n-1)的网络。一共有n种服务,每台计算机都运行着所有的服务。对于每台计算机,你都可以选择一项服务,终止这台计算机和所有和它相邻计算机的该项服务(如果其中的一些服务已经停止,则这些服务继续处于停止状态)。你的目标是让尽量多的服务完全瘫痪(即:没有任何计算机运行该项服务) 上机题目:黑客的攻击(Hacker.*,1秒,256M) 输入格式 第一行为整数n;以下n行每行描述一台计算机的相邻计算机,其中第一个数m为相邻的计算机个数,接下来m个数为这些计算机的编号。 输出格式 输出完全瘫痪的服务器的最大数量 样例输入 4 1 1 1 0 1 3 1 2 样例输出 2 数据范围 n≤16。 上机题目:黑客的攻击(Hacker.*,1秒,256M) 一些想法: 只有当一个集合里的点能够瘫痪服务器时,这个集合才是有意义的。 我们想要知道最多能瘫痪的服务器数量,实际上就是图中所有的点划分成多个集合,每个集合的值都是0或1,表示是否能瘫痪该种服务。 上机题目:黑客的攻击(Hacker.*,1秒,256M) 如何判断哪些集合能够瘫痪一种服务? 暴力? 位运算! 上机题目:黑客的攻击(Hacker.*,1秒,256M) 如何划分集合? 暴力? 位运算! 上机题目:黑客的攻击(Hacker.*,1秒,256M) 具体实现: //预处理出每个点相邻的节点 for(int i=0;in;i++){ scanf(%d,m); p[i]=1i; while(m--){
文档评论(0)