【UVa 12186】Another Crisis】的更多相关文章

[Link]: [Description] 给你n个员工和一个boss; 这n个员工和boss之间的关系是一棵树; 然后,现在最底层的叶子节点,想要向上级写信; 每个叶子节点都会向上级写一封信; 然而,每个中级人员,只有在它的下属中的百分之T以上的人都给它写信,它才会往上一级写信; 问你boss收到信,最少需要多少个工人写信才够; [Solution] 设dp[x]表示x往上写信,最少需要有几个工人写信才够; cnt[x]为x的儿子节点的个数; 则在做dfs的时候,把儿子节点的dp值升序排,存在…
偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比如,如图1-6(a)所示的矩阵至少要把3个0变成1,最终如图1-6(b)所示,才能保证其为偶数矩阵. (a)                 (b) [输入格式] 输入的第一行为数据组数T(T≤30).每组数据的第一行为正整数n(1≤n≤15):接下来的n行每行包含n个非0即1的整数,相邻整数间用一…
(解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值.比如,n=4,且4个人的金币数量分别为1,2,5,4时,只需转移4枚金币(第3个人给第2个人两枚金币,第2个人和第4个人分别给第1个人1枚金币)即可实现每人手中的金币数目相等. [输入格式] 输入包含多组数据.每组数据第一…
Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: there is no stopping them;the ants will soon be here. And I, for one, welcome our new insect overlords."Kent Brockman Piotr likes playing with ants. H…
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=52 [Description] 给你一个n*m的数字矩阵; 矩阵上的每个位置包含一个数字a[i][j]; 你一开始可以在第一列的某一个位置开始取数; 然后再往右,或右上或右下走; 直到走到最后一列为止; 你可以拿走你所走过的格子上的所有数字; 问你拿走的所有数字的和的最小值;…
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4093 [Description] 给你n个点的坐标,这n个点的坐标按照x的大小升序排; 然后要求你从最左边的第一个点开始走,一直走到最右边,然后再从最右边走到最左边,在走的过程中,要求2..n-1这些点都被走,且严格只被走一次; 问你最短距离; [Solution] 假想成两…
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=378 [题意] 给你n个方形; 由3个属性,长宽高决定; 你可以任意摆放这个方形(即把哪一面朝下方); 然后每种方形都有无限个; 一个方形能够摆在另外一个方形上面,当且仅当这个方形的长和宽都严格大于另外一个方形的长和宽(即changi>changj &&…
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3466 [题意] 有n个站台;(线性的); 每相邻两个站台之间的火车的行驶时间是固定的; 然后每天在第一个站台会向第n个站台的方向发出m1辆车; 最后一个站台会向第1个站台的方向发出m2辆车; 给出m1辆车是何时发出的,m2辆车是何时发出的(递增顺序给出); 然后有一个人要从1…
[Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由多少个回文串组成; [Solution] 用枚举中心点的方法,得到为回文串的子串; 即bo[1010][1010]; bo[i][j]为true,表示这一段是回文; 否则不是回文; (回文在枚举的时候,有长度为奇数和长度为偶数两种情况,长度为奇数的,中心点只有一个,长度为偶数的中心点有两个) 然后设…
[Link]: [Description] 你要构建一个供电系统; 给你n种灯泡来构建这么一个系统; 每种灯泡有4个参数 1.灯泡的工作电压 2.灯泡的所需的电源的花费(只要买一个电源就能供这种灯泡的所有灯泡使用); 3.灯泡的单个价格 4.灯泡的所需个数; 现在,你可以把某一些灯泡换成另外一种灯泡电压要严格更高; 然后所需的灯泡个数不变,其他的都变成另外一种电压的属性; 问你最少需要花费多少钱构建这么一个供电系统; (即买电源的钱+买灯泡的钱) [Solution] 把所有的灯泡,按照电压的大…
[Link]: [Description] KTV给你T秒的唱歌时间; 你有n首一定要唱的歌; 然后有一首很变态的歌有678s,你想在T秒结束之前唱一下这首歌; 因为这样的话,你能尽量晚地走出KTV(不会在你唱到一半的时候让你不唱了),即你最后的唱歌时间是可以超过T秒的; 告诉你n首歌的时间; 这n首歌里面任选几道唱,但必须要留一点时间唱那首变态的歌; 问你最多能唱多少首歌,然后在唱歌最多的基础上,问你最晚能什么时候走出KTV [Solution] 如果∑a[i]<T的话,则直接输出答案n+1和…
[Link]: [Description] 括号序列由这样的规则生成: 1.空字符是一个括号序列; 2.在括号序列两端加上一对括号也是括号序列; 如(s),[s]; 3.两个括号序列A和B,连在一起,也是一个括号序列,即AB也是括号序列 给你一个只包含"()[]"这4种字符的字符串; 让你添加最少的括号,使得所成的序列是一个括号序列; [Solution] 根据括号序列的生成规则; 设dp[l][r]是,l..r这一段变为合法的括号序列需要添加的括号个数; dp[i][i] = 1;…
[Link]: [Description] 给你两个序列,都由大写字母组成; 每次,把两个序列中的一个的开头字母加在字符串的尾端,然后在那个序列中删掉那个开头字母; 最后得到一个字符串; 这个字符串显然后很多种; 让你找所有字母的L(C)的和的最小值; L(c)是某个字母在最后的那个字符串中出现的结尾位置和开始位置的差值; [Solution] 设f[i][j]表示第一个序列1..i全都移除掉了,第二个序列1..j全都移除掉了的最小L(c)和; 这里不能直接算出某个字母的L(C)值,但是能一步一…
[Link]: [Description] 有一个n(n≤1000)位密码锁,每位都是0-9,可以循环旋转.每次可以让1-3个相邻 数字同时往上或者往下转一格.例如,567890->567901(最后3位向上转).输入初始状态 和终止状态(长度不超过1000),问最少要转几次.例如,111111到222222至少转2次,由 896521到183995则要转12次. [Solution] 以密码锁的每一位为阶段; 会发现,当前位影响到的,不止当前这一位; 可能还能影响i+1,i+2位; 且; 第i…
[Link]: [Description] 给你两个串s1,s2; 让你生成一个串S; 使得s1和s2都是S的子列; 要求S最短; 求S的不同方案个数; [Solution] 设两个串的长度分别为n1和n2; 则答案为n1+n2-两个串的最长公共子序列 不同的串则可以在求最长公共子序列的时候顺便求出; 设dp2[i][j],表示第一个字符串前i个字符,第二个字符串前j个字符能组成的不同的字符串的个数; dp1[i][j]是最长公共子序列数组 如果 s1[i]==s2[j],dp2[i][j] =…
[Link]: [Description] 给你n个集合; 每个集合都包含一些不同面额的邮票; (每种邮票都当做有无限张) 然后给你一封信上最多能贴的邮票张数S; 问你,哪一个集合的邮票; 能够贴出来从1开始的,最大的连续邮票面额 优先输出小的集合,集合大小一样的话,从大到小排序后,字典序小的优先输出; [Solution] 每个邮票都是一个物品; 假设每个邮票都最多能拿S个; 做一个多重背包即可 这里 设f[i][j]表示前i个邮票,邮票的总面额为j的情况最少需要的邮票张数; 对每个集合都做一…
[Link]: [Description] 你能对字符串进行压缩的操作; 即把连续出现的相同的子串改成它出现的次数+这个最基本的字符串的形式; 问你这个字符串最短能被压缩得多短; [Solution] 设f[i][j]表示,i..j这一段最短能压缩得多短; d[i][j]表示i..j这一段最短的形式压缩成的字符串是什么; 对于一段i..j 有两种可能 1.是两个压缩串合并起来的; 2.自己构成一个压缩串 对于第一种,枚举间断点; 对于第二种,看看最短的母串是什么,用最短的母串构造压缩; 看看间断…
[Link]: [Description] 给你一个n*m的格子; 然后里面零零散散地放着葡萄 让你把它切成若干个小矩形方格 使得每个小矩形方格都恰好包含有一个葡萄. 要求切的长度最短; 问最短的切割距离; [Solution] 记忆化搜索; 先枚举位点竖着切; 再枚举位点横着切 需要快速计算某个正方形内有多少个葡萄; ->前缀和; 每个dfs有5个参数; x0,y0,x1,y1,cnt 左边4个参数,是当前切的这个矩形的左下角和右上角,以及这个矩形当前的葡萄个数; 输出dfs(1,1,n,m,…
[Link]: [Description] 有4堆书; 每本书编号从1..20 每堆书都是N本; 然后每次只能从任意一堆的堆顶拿一本书装到自己的口袋里; 你的口袋最多容纳5本书; 当你的口袋里有两本一样的书的时候,那一对书就归你了; 但是一旦你的口袋装满了,就不能再装书了;游戏停止 问你最多能拿多少对书. [Solution] 比较明显的动规了; 每次只能从4堆书的堆顶中选择一本书 定义f[i][j][k][l]表示第一堆书上有i本数,第二堆书....获得的最大书对数; 则从某一堆书上拿一本书;…
[Link]: [Description] 给你一张平面图; 最多可能有3只鬼; 给出这几只鬼的初始位置; 然后,这几只鬼有各自的终点; 每秒钟,这几只鬼能同时移动到相邻的4个格子中的一个 任意两只鬼不能交换位置 两只鬼不能走到同一个位置 问你都走到终点最短的时间. [Solution] 因为图很小; 所以把二维的图; 转换成n*m个点; 然后建立点与点之间的关系; (每个点和相邻的4个非墙的点连边) 转化成一维的点; 即因为是小图,所以转换成点,线图 这样处理起来比较简单,不用每次都找附近的4…
[Link]: [Description] 给你最多n个棍子; (n< = 64) 每根棍子长度(1..50) 问你这n根棍子,可以是由多少根长度为x的棍子分割出来的; x要求最小 [Solution] 首先,将各根棍子的长度求和->sum 最后的长度x肯定是sum的因子; 则枚举x从各根棍子长度的最大值到sum作为因子; 枚举量假设为len; 然后一直用剩余的棍子去凑这个长度len 凑够了,就重新选择剩下的棍子,继续凑len; 剪枝: 1.还需要凑的量为len,但是尝试用完某根棍子之后,无法…
[Link]: [Description] 在一个r*c的格子上; 求最长的下降路径; [Solution] 记忆化搜索; f[x][y]表示从(x,y)这个格子往下还能走多远; 因为是严格递增,所以有单调性. [NumberOf WA] 0 [Reviw] [Code] #include <bits/stdc++.h> using namespace std; const int N = 100+10; const int dx[5] = {0,1,-1,0,0}; const int dy…
[Link]: [Description] 让你用最多n根棍子,组成一个数字,使得它能够被m整除; 数字1..9分别需要用-根棍子. 要求这个数字尽可能地大; 然后输出这个数字. [Solution] 设f[i][j]表示i位数字,对m的取余结果为j,最少需要多少根棍子; 这个做一下简单的DP就能弄出来; 这里的f数组允许出现前导的0; f数组弄出来以后; 枚举最后的答案有多少位i; 然后如果f[i][0]<=n; 则对第i位的x 从大到小枚举; 第i为是x的话; 能够推出来前i-1位组成的数字…
[Link]: [Description] 给你长城上的n个修补点,然后你的位置为x; 你需要依次去这n个点,然后把它们全部修好. 但是修的前后顺序不一样的话,花费不一样. 如果立即把第i个点修好的话,需要c[i]点花费; 每多t秒钟,就要多花费t*d[i]点花费. 你一开始的位置在x,然后你的移动速度为v; 求修完所有的点的最小花费. [Solution] 区间动态规划 在任意时刻,你当前的位置,和你之前走的位置肯定是在连续的一段区间上的,因为你不可能跳过一个点不修,而去修它旁边的一个点.因为…
[Link]: [Description] 等价题意: 某人在1..n内选一个数x; 然后让你去猜; 你可以问他是不是在哪个范围里; 每次会告诉你YES或者NO; 问你在最坏的情况下猜出答案需要猜多少次; 且猜的数字大于x的次数不能超过k次. [Solution] 动态规划. 设f[i][j]表示前i个水球,做了j次试验;能得到的最大高度; 这里的f[i][j]; 指的是,如果问的数字是1..f[i][j],的话,用i个水球都能够通过试验猜到. (这里的状态f[i][j]中,j>=i也是可行的状…
[Link]: [Description] 给你n个人; 有一些人之间有认识关系 a认识b,b不一定认识a 让你把这n个人分成两组 使得这两组中的每一组: 组内的人与人之间都相互认识. 并且,使得两组的人数之差尽可能小; 输出分组的方案; [Solution] 如果A和B不是相互认识 那么他们俩肯定是在不同的组 则,在不是相互认识的人之间建一条边; 这样就能形成一张图了; 并且可能有多个连通块 然后,对每个连通块做二分染色; 如果全都能做二分染色; 则有解 这样,每个连通块都有的点被染成0,有的…
[Link]: [Description] 玩跳舞机. 有一定的约束. 归纳起来就是以下三点 1.两只脚不能同时踩一个位置 2.如果左脚踩在了右键上,那么下一次移动的一定要是左脚 3.如果右脚踩在了左键上,那么下一次移动的一定要是右脚 这3个规则和题目所要求的题意等价. 点号的时候,可以任意移动你的脚,或者不移动脚,不移动脚的话就不会产生任何体力. 问你完成所给的游戏序列,最少需要耗费多少体力. [Solution] 设f[i][a][b][s]表示完成了游戏序列的前i-1个,且完成第i-1个之…
[Link]: [Description] 给你n个物体,每个物体都有m种属性; (每个物体的属性都能和别的物体的属性区别) 现在,你已知这n个物体; 然后让一个人心里想一个物体 你可以问这个人,这个物体是否有第i个属性; 显然,这样最后是肯定能问出来你心里所想的那个物体的; 问你,在最坏的情况下,最少要问多少次才够; [Solution] 首先,需要明确,每个属性最多问一次 问哪些属性是决定最后结果的关键; 所以在写dp的时候; 我们需要确定下一个需要选择问哪个属性,以及这个问题的答案是什么,…
[Link]: [Description] 一个学校,有s门课程(1<=s <=8),里面本身已经有m个老师了,然后还想招聘n个老师: 给出这m个老师和n个来应聘的老师的信息; (c[i]->工资,以及他们能教哪几门课程); 原本的m个老师一定要继续保留下来; 问你在这个条件下,如何选取这n个老师中的一些人; 使得每门课都至少有两个人能教,且花费的总工资最少. [Solution] 设f[i][j]表示前i个老师(不包括原有的m个老师),能教课程的状态为j的情况下最少需要花多少工资; 这…
[Link]: [Description] 你有n(n≤100)个相同的仓库.有m(m≤30)个人应聘守卫,第i个应聘者的能力值 为Pi(1≤Pi≤1000).每个仓库只能有一个守卫,但一个守卫可以看守多个仓库.如果应聘 者i看守k个仓库,则每个仓库的安全系数为Pi/K的整数部分.没人看守的仓库安全系数为0. 你的任务是招聘一些守卫,使得所有仓库的最小安全系数最大,在此前提下守卫的能力 值总和(这个值等于你所需支付的工资总和)应最小. [Solution] 动规 能力总和最大值为30000 安全…