UVA
哈希表扁豆
此人不懒,但什么都没写
展开
-
非严格次小生成树
允许与mst权值和相等。#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>using namespace std;const int maxn=150,maxm=100005;const int inf = 1e9;int t,n,m,cnt,mst,logg[maxn],mx[maxn][15],pre[.原创 2022-01-29 00:55:48 · 402 阅读 · 0 评论 -
UVA1201 Taxi Cab Scheme(二分图最小路径覆盖)
ProblemSolution可以转化成dag上的最小路径覆盖,dag的最小路径覆盖可以放在二分图上求。对于原图中的a->b,在二分图中连a->b’,dag上的最小覆盖=n-最大匹配(即左部中未匹配点数量,等价于所有覆盖的起点数量)。Code#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;co原创 2022-01-09 14:38:34 · 262 阅读 · 0 评论 -
UVA12083 Guardian of Decency(二分图最大独立集)
ProblemSolution原题要求选出的点中任意两点需至少满足一个条件,可以在四个条件都不满足的点间连边,所得图为二分图(一边男一边女),等价于求二分图的最大独立集。二分图最大独立集与最小覆盖集二分图最独立集大小=结点数-最大匹配(这里的最大匹配可以看成选择有边相连的两个点时要去掉其中一个,最大匹配数即为最小要去掉的点数,同时也是最小覆盖)。覆盖集:对于每条边,至少有一个点要被选中。独立集:对于每条边,至少有一个点不被选中。因此两者互补。最小覆盖集大小=最大匹配的大小。Code#原创 2022-01-09 13:59:36 · 288 阅读 · 0 评论 -
稳定婚姻问题(UVA1175 Ladies‘ Choice)
Problem在一个盛大的校园舞会上有 n 位男生和 n 位女生,每人都对每个异性有一个排序,代表对他们的喜欢程度。你的任务是将男生和女生一一配对(每人恰好有一个舞伴),使得男生 u 和女生 v 不存在以下情况:(1)男生 u 和女生 v 不是舞伴;(2)他们喜欢对方的程度都大于喜欢各自当前舞伴的程度。如果出现了(2)中的情况,他们可能会擅自抛下自己的舞伴,另外组成一对。Gale-Shapley算法每一轮每一个尚未订婚的男士向自己当前好感度最高且还未向其求过婚的女士求婚,然后女士在向她求婚的人中选择原创 2021-12-31 09:48:51 · 292 阅读 · 0 评论 -
UVA1411 Ants
无原创 2021-12-29 12:01:03 · 246 阅读 · 0 评论 -
UVA1663 净化器 Purifying Machine(二分图匹配)
ProblemSolution得到了二分图匹配的提示才想到怎么做,还是太笨了 。一个模板可能匹配一个串或两个串,要让匹配两个串的模板尽可能的多,建立二分图,能用一个模板匹配的串连边,设最大匹配为ans,给定的模板集合所能匹配的串数为ele,答案即为ele-ans+ans/2。位运算小技巧:x第y位置0: x|=(1<<y);x第y位置1:x&=~(1<<y)。Code#include<iostream>#include<cstring&g原创 2021-08-31 20:15:40 · 172 阅读 · 0 评论 -
UVA1668 Let‘s Go Green
Problem求最少用多少边能覆盖整个树,给出每条边被覆盖的次数Solution挺巧妙的逆向思维,最大值就是边权和,然后尽可能对每个点周围的边合并,根据周围一圈的最大值与一圈和的关系计算并掉多少。Code#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;const int maxn=1e5+5;in原创 2021-08-23 17:00:31 · 114 阅读 · 0 评论 -
UVA12118 检查员的难题 Inspector‘s Dilemma
在完全图中找一条欧拉道路,使之经过选中的边且距离最小。等价于将图中各个连通块连接,且使得每个子连通块存在欧拉道路。欧拉道路:存在欧拉道路当且仅当度为奇数的点的个数小于等于2且连通。这里用的并查集维护。#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1005;int .原创 2021-05-16 00:11:15 · 117 阅读 · 0 评论 -
UVA116 单向TSP Unidirectional TSP
注意写法,细节的处理方式,递推的方向。#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int inf =0x3f3f3f3f;int m,n,ll,rr;int g[15][105],d[15][105],c[3]={-1,0,1},pre[15][105],pos[4];int main(){// freopen("1.txt.原创 2021-05-15 00:39:08 · 111 阅读 · 0 评论 -
UVA1412 基金管理 Fund Management
状态压缩,一个状态是一个九进制数,vector<vector >states对状态编号(编号>状态),map<vector,int>id(状态>编号)紫书的代码里用一个vector< int >表示状态,巧妙。预处理编号为状态s下对股票i的进行买卖操作后得到的状态编号。#include <iostream>#include <cstdio>#include <vector>#include <map>.原创 2021-05-13 01:50:34 · 103 阅读 · 0 评论 -
UVA1252 20个问题 Twenty Questions
与校长的烦恼高度相似,多集合组成状态,集合用压缩的状态表示。d(s,a)表示询问的集合为s,目标物体特征为a时最少还需要询问几次。枚举下一次所有可能的询问,假设下一询问为k,则询问次数为max(d(s+{k},a),d(s+{k},a+{k}))+1,d(s,a)取所有可能的k中的最小值。边界条件为只有一个物品满足a中所有特征且不满足s-a中特征时d(s,a)=0。注意:在计算过程中存在目标不在所有物品中(因为目标是假设的),没有物品满足a中所有特征且不满足s-a中特征时d(s,0)=0。可预处理优化.原创 2021-05-11 00:58:49 · 249 阅读 · 2 评论 -
UVA10817 校长的烦恼 Headmaster‘s Headache
题意:校长的烦恼 Headmaster’s Headaches很小,不难想到用状态压缩处理。但是我对状态压缩的应用还是固守在了处理棋盘上,一开始想的是把每门学科用两位二进数表示,但是没法做状态转移。正解:用两个二进数表示当前状态,第一个数s1表示恰有一个人教的学科集合(某一位为0表示不在集合中,某一位为1表示在集合中),另一个数表示至少有两个人教的学科的集合,d(i,s1,s2)表示已经考虑了前i-1个人时(前i-1人聘用情况确定即s1s2确定,后面人的聘用情况任意)此状态下的最小花费,答案为d(1,.原创 2021-05-10 19:41:23 · 97 阅读 · 0 评论 -
UVA1610 聚会游戏 Party Games
仔细读题,大于等于而不是大于;首先对所有字符串排序;如果在两者最短长度内一直相同,答案就是这一部分;考虑能不能在第一位不一样的位置j解决,分三种情况:较小串的长度为j+1,较大串与较小串在这一位的差值大于1,较大串的长度>j+1;需保证字典序最小,三种情况应一次讨论;根据较小串找到最低的能够确定答案的位,注意,如果是最后一位,答案应该是较小串的最后一位;#include <iostream>#include <cstdio>#include <cstri.原创 2021-04-19 20:46:36 · 131 阅读 · 0 评论 -
UVA11925 生成排列 Generating Permutations
转换成将原排列装换成有序排列,最后倒着输出操作。考虑操作的必然性,每次两个操作选一个,如果第一个元素大于第二个,就交换,否则将最后的元素拿到最前面。考虑边界,当第一个元素为n时必须将最后的元素拿到最前面。#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int a[600050],n,pos,change[180.原创 2021-04-13 21:12:35 · 110 阅读 · 0 评论 -
UVA120 煎饼 Stacks of Flapjacks
不需要考虑效率的烙饼排序,不难发现我们可以将任意位置的煎饼在不影响下面的情况下翻到最上面,同时可以将最上面的煎饼翻到任意位置;因此可以参考选择排序,每次找一个最大的先翻到最上面,然后再将其翻到正确的位置。#include<iostream>#include<algorithm>using namespace std;int a[35],x,cnt,b[35],ans[35],num,tmp,d[35];char c;void solve(){ for(int i=.原创 2021-03-29 12:04:50 · 110 阅读 · 0 评论 -
UVA11582 巨大的斐波那契数! Colossal Fibonacci Numbers!
F[i]=f[i] mod n;F[i]<n;F[i]与F[i+1]重复出现时,整个序列就会开始重复出现;最多n^2项就会重复出现,算出F[a ^ b]对应那一项即可。#include<iostream>#include<cstdio>using namespace std;unsigned long long f[1000005],t,a,b,n,len;unsigned long long pow_mid(unsigned long long aa,uns.原创 2021-03-13 10:36:45 · 130 阅读 · 0 评论 -
UVA10976 分数拆分 Fractions Again?!
从2k到k枚举x,通过(k*x)%(x-k)==0判断当前x是否可以。#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;int k,x,y,ans,a[10005],b[10005];int main(){ while(cin>>k) { for(x=2*k;x>k;x--) if((k*x)%(x-k)==0) { a[+.原创 2021-03-13 08:38:49 · 71 阅读 · 0 评论 -
UVA11059 最大乘积 Maximum Product
入门题,别忘清maxn和注释freopen。#include<iostream>#include<algorithm>#include<cstdlib>using namespace std;long long n,a[20],maxn,nw,num;int main(){// freopen("1.txt","w",stdout); while(cin>>n) { maxn=0; for(int i=1;i<=n;i++.原创 2021-03-12 23:58:48 · 81 阅读 · 0 评论 -
UVA725 除法 Division
先把符合条件的单个数筛出来,总共三万多;对于给定的n,在筛出来的数中从小到大枚举除数,直到n*当前数>=筛出来的最大数;在满足前面的条件的基础上进一步判断能否组成排列。代码又臭又长! #include<iostream>#include<cstdlib>#include<cstdio>using namespace std;bool ok[100005],a[10],e;int q[100005],pos,n,num,aa[10];void .原创 2021-03-12 23:35:58 · 164 阅读 · 0 评论 -
UVA1600 巡逻机器人 Patrol Robot
BFS,注意当前跨越的次数也要加进位置状态里。#include<iostream>#include<cstdio>#include<cstring> #include<queue>#include<cstdlib>using namespace std;int t,m,n,mst,net[25][25],x[4]={1,-1,0,0},y[4]={0,0,1,-1};bool inq[25][25][25];struct no.原创 2021-03-12 22:27:24 · 119 阅读 · 0 评论 -
UVA712 S树 S-Trees
无需建树,直接定位;变量行无用;输入有几个问题:cin+getline的组合会导致用getline输入的字符串丢失第一位,getline+getline第二个getline输入的字符串会丢失一位,输入的两行字符串第二个字符串可以用scanf读入。另外,getline而入一行后不需要用getchar()读掉末尾的换行符,否则下一行字符串还是会丢失一位,可以理解为getline读入了换行符且作为了结束标志。#include<iostream>#include<cstdio>.原创 2021-03-12 18:47:57 · 143 阅读 · 0 评论 -
UVA673 平衡的括号 Parentheses Balance
栈处理,注意审题以及字符串读取的细节。#include<iostream>#include<cstring>#include<cstdlib>using namespace std;int n,ans,a[105],pos;char s[100005];int main(){ cin>>n; getchar(); while(n--) { gets(s); int len=strlen(s); for(int i=0;i.原创 2021-03-11 22:02:55 · 81 阅读 · 0 评论 -
UVA439 骑士的移动 Knight Moves
BFS#include <iostream>#include <cstdio>#include <queue>#include <cstring>using namespace std;int x[8]={-2,-2,-1,-1,1,1,2,2},y[8]={-1,1,-2,2,2,- 2,1,-1};struct pos{ int x,y,n;};char a,b,c,d;bool inq[100][100];int ans.原创 2021-03-11 11:22:28 · 65 阅读 · 0 评论 -
UVA12166 修改天平 Equilibrium Mobile
确定了一个叶子结点的质量,整棵树的质量就确定了,统计每个叶子结点所能确定的树的质量x,答案为叶子结点树-出现最多的x的次数。#include<iostream>#include<cstdio>#include<map>#include<cstring>#include<cstdlib>using namespace std;long long n,ans,pos,num=1,maxn,nd;string a;map<lo.原创 2021-03-04 22:35:49 · 73 阅读 · 0 评论 -
UVA536 二叉树重建 Tree Recovery
根据前序和中序遍历递归建树,输出后序遍历。#include<iostream> #include<cstdio>#include<cstring>#include<cstdlib>using namespace std;char tr1[35],tr2[35],tr3[35];int num=1,ans;struct node{ int l,r; char a;}n[305];int build(int l1,int r1,int .原创 2021-03-04 19:55:21 · 112 阅读 · 0 评论 -
UVA572 油田 Oil Deposits
入门级bfs求连通块两个技巧:一重循环遍历至四周;打标记;#include <iostream>#include <cstdio>#include <queue>#include <cstdlib>using namespace std;int m,n,ans,xx[8]={-1,-1,-1,0,0,1,1,1},yy[8]={-1,0,1,1,-1,1,-1,0};struct node{ int x,y;};char oil.原创 2021-03-04 00:13:08 · 91 阅读 · 1 评论 -
UVA839 天平 Not so Mobile
递归入门练习题天平的总质量作为函数的返回值。#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;int n,ans,tp;int getans(){ int a,b,c,d; cin>>a>>b>>c>>d; if(!a) a=getans(); if(!c) c.原创 2021-03-03 23:49:18 · 63 阅读 · 0 评论 -
UVA297 Quadtrees
题目中给出的四分树一定是“满叶”的,因此知道了先序遍历就能确定这棵树,边读入边建图即可;统计答案时同时遍历两棵树;注意在计算答案的过程中可能会出现一颗树的当前节点已经不存在的情况,同样要作为边界处理;#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;const int maxn=32*32;struct node{ int a,b,c,d; .原创 2021-03-03 18:01:01 · 94 阅读 · 1 评论 -
UVA548 Tree
可以根据一颗树的后序遍历确定树的根,进而根据中序遍历确定左右子树;注意递归的思想,实现可以参考线段树的建树思路,任一子树在遍历中是连续区间,用l,r表示即可。#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>using namespace std;int ls[10005],rs[10005],inod[1.原创 2021-03-01 23:54:16 · 68 阅读 · 0 评论 -
UVA 122 Trees on the level
注意not complete时条件的表达。#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <cstdlib>using namespace std;struct node{ int l,r,p;}n[305];int num=1,ans[305],pan;char str[305];void mem(){.原创 2021-03-01 21:17:52 · 76 阅读 · 0 评论 -
UVA515 King
题目描述:n个数,m个限制条件。每一个限制条件形如:1.x y gt c:表示ax + ax+1 + … +ay > c。2.x y It c:表示ax + ax+1 + …… +ax+y < c。有解输出“lamentable kingdom”,否则输出“successful conspiracy”。思路:与intervals那道题很像,题目给出的是和的关系,通过前缀和来得到差的关系,然后就是传统差分约束的建图,求最长路,通过判正环来确定有无解。当时我虽然想到了这道题的核心做法,但是却纠.原创 2020-11-24 16:35:02 · 88 阅读 · 0 评论 -
UVA1364 Knights of the Round Table
一群骑士,要有若干个(三个及以上的奇数个)骑士围成一个圈开会,有m组冲突关系,对于每一组(i,j),表示骑士i和骑士j不能相邻开会,求有多少个骑士一场会议都不能参加。原创 2020-11-19 23:05:08 · 112 阅读 · 0 评论 -
Now or later
间隔最小值尽量大,二分时间t。一架飞机的早与晚看成图上两个点i与!i,验证当前mid值,若两点i,j间的间隔<t,则连i->!j,j->!i,表示选了i不能选j,选了j不能选i.注意二分不要写错#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>using namespace std;.原创 2020-11-14 16:21:10 · 166 阅读 · 0 评论 -
UVA11766 Racing Car Computer
解法巧妙的一道题!题意:n辆赛车,n条信息,第i条信息告诉你编号为i的车前面与后面分别有多少量车,求最少有多少条信息是错误的。将问题转换一下,等价于最多有多少条信息是对的。考虑每条信息意味着什么:知道了前后有多少量车,也就知道了这辆车的排名区间以及有多少量车与它并排!每一条合法(对它自己而言)的信息可以确定一个排名区间,如a=1,b=2,n=5,它的排名区间就是[2,3],如果两条信息得出的排名区间有重叠,那么它们就是冲突的,反之不冲突。我们可以做这样一个处理:每得出一个区间[i,j],就给cn.原创 2020-11-03 23:33:49 · 81 阅读 · 0 评论 -
UVA658 这不是bug,而是特性 It‘s not a Bug, it‘s a Feature!
题意:补丁在修正BUG时,有时也会引入新的BUG,假定有n(n<=20)n(n<=20) 个潜在BUG,和m(m<=100)m(m<=100) 个补丁,每个补丁用两个长度为nn 的字符串表示,其中字符串的每个位置表示一个bug,第一个串表示打补丁之前的状态(“-”表示该BUG必须不存在,“+”表示该补丁必须存在,0表示无所谓),第二串表示打补丁之后的状态(”-“表示不存在,“+”表示存在,0表示不变)。每个补丁有一定的执行时间,你的任务是用最小的时间把所有BUG都存在的软件变得没有.原创 2020-10-31 11:50:57 · 145 阅读 · 0 评论 -
求图中的最大独立集或最大团(UVA 193)
几个概念完全图:简单无向图,图中的任意两个点之间有且仅有一条边相连,所有完全图都是它本身的团。补图:图G的补图通俗的来讲就是完全图Kn去除G的边集后得到的图Kn-G。团:顶点集C被称为无向图 G=(V,E) 的团,如果C是顶点集V的子集(C⊆V),而且任意两个C中的顶点都有边连接。最大团:图中定点数...原创 2020-10-28 00:44:54 · 868 阅读 · 0 评论 -
UVA1628送披萨
依旧使用具有“累加”意义的状态,与修长城不同的是,路过某点时不一定要累加改点的“权值”,但是每一次移动对今后所有累加的点的“权值”的影响是相同的,为此可以增加一维cnt,d(i,j,cnt,p)表示i~j的决策已经确定时,当前在p(i或者j),从(1 ~ i-1)与(j+1)中选取cnt个所能得到的“最大收益”,状态的转移可以通过枚举第cnt中的第一个累加的点实现,假设选取的点为x,则代表x+1 ~ i-1或j+1 ~ x-1的点舍弃 ,原因在于“在任意时刻,送餐的人已经考虑过的(送了或者决定放弃订单).原创 2020-10-21 20:38:14 · 203 阅读 · 0 评论 -
UVA10934 Dropping water balloons
题目描述:一年一度的新生周活动开始了,你们做好了大量的装满水的气球,准备拿来恶搞那些可 怜的新生。活动开始之前,你们突然发现一个问题:这些气球实在是太硬了,很难把它们打 破(如果打不破,它们就没有任何意义了)。甚至从好几层高的楼顶上把它们扔到地面,也 打不破。你的任务是借助一个n层的高楼确定气球的硬度(所有气球硬度相同)。 实验过程是这样的:每次你拿着一个气球爬到第f层楼,将它摔到地面。如果气球破了,说明它的硬度不超过f;如果没破,说明硬度至少为f。注意,气球不会被实验所“磨 损”。换句话说,如果在某层楼原创 2020-10-12 22:20:39 · 94 阅读 · 0 评论 -
树的最大独立集(UVA1220)Party at Hali-Bula
对于一颗n个结点的无根树,选出尽量多的结点,使得任何两个结点均不相邻(称为最大独立集),然后输入n-1条无向边,输出一个最大独立集(如果有多解输出任意一组)。任选一个根r,d(i)表示以i为根结点的子树的最大独立集大小,结点i有两种决策,选与不选,如果不选i,问题变成了所有儿子的值相加,如果选i,问题变成了所有孙子的值相加再加1,即d(i)=max(1+Σd(j),Σd(k));j为i的孙子(gs[i]),k为i的儿子(s[i])。实现时可以从s[i]与gs(i)的元素去找i,即当计算出一个d(i)后原创 2020-10-08 19:44:33 · 231 阅读 · 0 评论 -
UVA10003 切木棍 Cutting Sticks
d(i,j)表示将第i个切割点到第j个切割点分成i-j段所花费的最小代价,d(i,j)=min(d(i,k)+d(k,j)+a(i)-a(j)),为什么可以这样设置,因为我们考虑(i,j)的最小切割代价的时候,只有第一刀的代价是可以直接知道的,以此可以作为状态间转移的“跳板”。#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>using namespace std;原创 2020-10-07 20:55:46 · 128 阅读 · 0 评论