
紫书
minato_yukina
主播不是退役了,主播只是没有名额
展开
-
UVA 658 It‘s not a Bug, it‘s a Feature!
题意:给出m个长为n的字符串 (2个)s1,s2.表示这个补丁打之前要是s1的状态,打完之后就变成s2的状态。然后每个补丁有一个执行时间,初始状态是都有bug,问你最少用多少时间把这些bug全部修好。分析:由于补丁可以任意地打和不打,所以当修完补丁后,很可能会回到以前的状态,说明这个关系是一个DAG,有向无环图,如果使用记忆化搜索或者dp都是错误的,因为在递归时上一个状态还没计算完成,就回到了以前的状态,造成无限递归。dp与图论息息相关,我们把补丁看作状态,用一个二进制数s表示当前的bug有没有,打完补原创 2021-05-21 21:00:48 · 98 阅读 · 0 评论 -
紫书例题10-3 选择与除法 Choose and divide(UVA10375)
题意:给出p,q,r,s计算C(p,q)/C(r,s) 范围是10000.分析:暴力计算组合数是不可取的,因为有阶乘的存在。那么该怎么办呢?做除法实际上就是约去一些相同的因子,这些因子可以由唯一分解得到。想到这,结果已经是很显然了,简单地对式子进行推导,计算每一项对总的质因子贡献,得到每一个素数prime[i]对应的指数e[i],相乘即可得出答案。分子为+1,分母当然就是-1的贡献。唯一分解题…代码:#include<bits/stdc++.h>using namespace std原创 2021-05-13 19:53:11 · 165 阅读 · 0 评论 -
紫书10-4 最小公倍数的最小和(Minimum Sum LCM ) UVA10791
题意:给一个整数n,求至少两个各不同的正整数,让它们的最小公倍数为n,且这些整数的和最小.回顾下紫书的一些知识点。我们知道,lcm(a,b)=a*b/gcd(a,b).但这还不够。事实上,gcd是对a与b做唯一分解后,对每个质因子取最小值相乘,而lcm就是对每个质因子取最大相乘。整了这么多,如何让这个数的和最小呢?先考虑极限极限情况,假设就是n和1,这个时候就是n+1.那么怎么让它变小呢?没错!就是唯一分解,只要把lcm(a,b)中的一个数拿出来单独作为一个新的整数,会比之前小很多。假设不拿之前原创 2021-05-11 21:21:31 · 198 阅读 · 0 评论 -
紫书5-9 数据库
题目 :给出N*M大小的字符串矩阵,每个格子有个字符串,求出不同的两行和两列,使得这两行相等.1 2 3 4 5 7 2 5 7 看表格,就是2行3列和2行3列,确定的这四个元素,上下对应相等.思路:1.写一个发ID函数,把每个字符串编号.用map来存(因为等会要用这个编号)int ID(const string &s){ if(!id.count(s)){ id[s]=cnt++; } return id[s原创 2021-01-01 19:36:08 · 165 阅读 · 0 评论 -
紫书UVA116 单项TSP
给出一个m*n的数字矩阵,问从第一列任意行出发(只能直走,右下,左下),到最后一列所经数字的最小路径是什么,如果有多解,输出字典序最小解.这个矩阵第一行的上一行是最后一行,最后一行的下一行是第一行我们定义状态d(j,i)表示当前在第j列,第i行,当前数字和是多少。初始边界就是第一列的数字等于它自身.考虑状态转移:一个格子可以由前一列格子的三个格子转移过来.然后考虑如何表示那三列开一个row数组,保存当前状态的上一列那三行,特判一下当前行是1或者是n然后修改对应的row数组值。最后sor.原创 2020-12-18 16:14:58 · 163 阅读 · 1 评论 -
紫书海军上将
给出一个v(3≤v≤1000)个点e(3≤e≤10000)条边的有向加权图,求1~v的两条不相交(除了起点和终点外没有公共点)的路径,使得权和最小.分析什么是两条不相交的边?就是让各个点的容量为1(不是只有流量)。这是怎么做到的?就是把一个点拆成两个点,中间连一条容量为一的边,要保证拆后的两个点编号不同。然后拆完点跑一次最小费用流就可以了。但是这时候的流量是有限制的,因为只能是两条路,所以在扩展增广路的时候要加上一条这个东西。f(flow+a[t]>flow_limit) a[t]=f.原创 2020-12-16 16:10:54 · 178 阅读 · 0 评论 -
例题11-4 电话圈
给出n个人和m次通话,如果两个人(间接或直接)通话,那么则称这两人在一个电话圈中,求出所有电话圈.思路:在有向图中,如果我们不关心路径长度,思考任意两点间是否有通路,则将边权1代表通路,0代表没有路.d[i][j]=d[i][j]||(d[i][k]&&d[k][j])这样就求出任意两点间是否有通路。这个结果称为有向图的传递闭包.实现:读入的名字用取ID函数给一个ID作为起点,然后有路就是边权1,没有就是0,自己到自己边权是1.代码;#include<ios...原创 2020-12-04 15:59:17 · 341 阅读 · 0 评论 -
紫书6-8&&树的遍历与建树
1.问题1给一个树的中序遍历,与后序遍历,要你输出前序遍历.下面直接给出核心代码.void dfs(int L1,int R1,int L2,int R2){ if(L1>R1) return ; char root=post[R2]; int p=0;cout<<root; while(in[p]!=root) p++; int cnt=p-L1; dfs(L1,p-1,L2,L2+cnt-1); dfs(p+1,R1,L2+cnt,R2-1);}L1 R1..原创 2020-12-03 14:57:23 · 215 阅读 · 0 评论 -
紫书6.6小球下落
题目:有一棵二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从上到下从左到右编号为1, 2, 3,…, 2D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,状态都会改变。当小球到达一个内结点时,如果该结点上的开关关闭,则往左走,否则往右走,直到走到叶子结点。一些小球从结点1处依次开始下落,最后一个小球将会落到哪里呢?输入叶子深度D和小球个数I,输出第I个小球最后所在的叶子编号。假设I不超过整棵树的叶子个数。D≤20。输入最原创 2020-12-02 20:15:19 · 319 阅读 · 0 评论 -
紫书例题5-5 集合栈计算机
uva 12096超级难的一题..1.set<int> ()表示空集2.set_union求并集 set_intersation求交集用法set_union(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin())); 前4个参数是两个集合的起点终点.然后最后一个的插入迭代器第一个填同类型的的东西(新生成的并集)和那个起点.begin.交集同理set_intersection(x1.begi...原创 2020-12-01 15:49:54 · 218 阅读 · 0 评论 -
紫书5.2.4 map的应用
输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入的大小写,按字典序排列。思路:先把单词都弄成小写,字母重排嘛,不就是排序后看看各个数字是否相等.我们直接把处理后的字符(小写化且排序后)用map映射进行计数,计数值为1的就是答案.map的用法: map<string,int> q;q["dashabi"]=1;这样引用q["dashabi"]的值就是1.2.count的用法,c.原创 2020-11-28 16:57:29 · 160 阅读 · 0 评论 -
紫书5.2.3安迪第一个词典
题目:给一个文段,让你找出各个单词(空格分开),然后只输出一个(去重).思路用set保存字符串(字典序排序并去重).并且用stringstream分开字符串.1.复习ctype.h的几个函数 isalpha tolower(转成小写字母)2.set的使用及迭代器.迭代器可以理解为指针.用来遍历STL容器for(set<string>::iterator it=dict.begin();it!=dict.end();it++) { cout<< *it<&..原创 2020-11-28 15:52:52 · 161 阅读 · 0 评论 -
紫书例题5-2 木块问题
Uva 101繁琐的模拟题,有时候对于重复的动作,我们可以编写一个函数去实现他.1. int &a,int &b的妙用,查找各种木块的编号.void find(int a,int &p,int &h){ for(p=0;p<n;p++){ for(h=0;h<q[p].size();h++){ if(q[p][h]==a) return ; } }}传参的时候就直接 int pa,pb,ha,hb;find(a,pa,h.原创 2020-11-28 11:28:01 · 232 阅读 · 0 评论 -
紫书例题4-1 古老密码
题意给你一个字符串,然后这个字符串可以重排,一一映射(一个字母可以随便换),比如A映射到Z,B映射到A...然后再给一个答案字符串,问这个答案字符串能不能由上面的字符串重排映射得到.思路:因为可以重排,这提示我们字母的顺序其实根本没有关系.只需要统计两个字符串中各自字母出现的顺序,然后sort两个计数数组,如果他们的值都一一相等,则说明能通过重排变换得到.为什么会这样呢..举个例子原串 BBBXXX 答案串 VVVAAA 答案是yes...原创 2020-11-23 10:39:52 · 201 阅读 · 0 评论 -
紫书习题3-2 分子量
让人思考人生的一题题意给你一个分子式,然后让你计算它的分子量.1.首先要考虑元素连着的情况,然后分子量的计算要遇到后面的字母才计算2.然后也要考虑数字是二位数以上的情况,所以不能用getchar必须整段字符串输入.3.用一个temp储存上一次的字母,遇到下一个字母的时候再次计算.4.开关cnt的妙用。用它来检查字母状态并顺便计数,刘大爷nb.代码段#include<iostream>#include<ctype.h>#include<cstd.原创 2020-11-22 09:53:09 · 192 阅读 · 0 评论 -
紫书例题3-5 环状序列
题目给出一个DNA环(A.C.G.T组成一个环)求最小字典序输出序列.如CTCC最小字典输出序列就是 CCCT。for(j=0;j<len;j++){ if(s[(now+j)%len]!=s[(next+j)%len]){ if(s[(now+j)%len]<s[(next+j)%len]) return false; else return true; }}核心代码比较每个序列对应的字母大小相等跳过,答案序列大的就返回true修改答案序列,答案序列小的就...原创 2020-11-18 20:30:33 · 214 阅读 · 0 评论 -
紫书例题3-5 生成元
题目一个数字x加上它各个位数得到数字y,那么x是y的生成元(x一通操作得到y)比如120的生成元之一(可能?)是114.给出一个数字n(1<=n<=100000),求最小生成元。朴素做法,枚举n-1前每个数字的生成元,看它能否等于你要求的数字。然后看一下数字n=1e5,我感觉没戏..再想,我能不能把每个数字(x)能生成的y记录下来形成一种二元关系.然后它问哪个,我就查表给哪个就完事了,然后复杂度是O(n)吧然后核心部分,至于中间某变量为什么叫xxxxx,我第一次做用的i,然...原创 2020-11-18 19:03:02 · 378 阅读 · 0 评论 -
紫书第三章例题3-4 uva340
uva340统计正确位置(A)的数字很简单,扫一遍两个数组判断是否匹配即可。统计出现过的数字但位置不对的数字数目从正面推比较难。可以这么思考:出现过的数字但位置不对的数字数目=总数-正确位置数字的总数(A)那么,只要求出所有所谓所有数字的“总数”即可。那么总数又是什么,我认为是上下相同数字的匹配数,如下面 1有2个匹配数,5有1个匹配数(1与1匹配,5与5匹配,无论位置是否正确),如果位置正确,那它会被加到正确位置数字的总数上,不正确的,我们通过上面的减法求出.通过上面的观察我们大致知道(?).原创 2020-11-16 23:04:07 · 226 阅读 · 0 评论