![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM_UVA
TK13
你在凝视深渊的时候 深渊也在凝视着你
展开
-
UVA11019KMP(二维矩阵匹配出现次数)
题意: 给你两个矩阵,一个大的一个小的,然后问你这个小矩阵在大的矩阵里出现了多少次?思路: 说好了AC自动机的,我自己尝试写了个暴力的KMP竟然过了,AC自动机自己的模板还没写完,就暂时没用,说下KMP的解法吧,首先我们考虑如果是一维的情况,是不是就直接KMP裸题了,那么我们就想办法把二维降成一维,我用的是比较笨的方法就是把每一数列看成一个字母(每次比较的时候要比较一数原创 2015-01-04 17:13:12 · 909 阅读 · 0 评论 -
UVA11134传说中的车(放棋子)
题意: 给你一个n*n的棋盘,让你在棋盘上放n个棋子,要求是所有棋子不能相互攻击(同行或者同列就会攻击),并且每个棋子都有一个限制,那就是必须在给定的矩形r[i]里,输出每个棋子的位置,special Jude。思路: 看完后第一反应就是匈牙利(哎!惭愧啊。)结果想着怎么建图,想了一会呵呵了,果断想别的方法,其实这个题目设计到一个小思想非常好,那就是把整体分原创 2014-12-07 14:26:37 · 953 阅读 · 0 评论 -
UVA10870递推关系(矩阵乘法)
题意: 给以个递推f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + ... + ad f(n - d), for n > d.,给你n,d,a1,a2..ad ,f[1],f[2]..f[d],让你求f[n]%m.思路: 比较基础的矩阵题目,每次都构造一个d*d的矩阵,然后用快速幂求出来它的n-1次幂,然后在求原创 2014-12-07 14:17:14 · 646 阅读 · 0 评论 -
UVA10341解方程(二分)
题意: 给你一个方程 F[x] = pe^-x + qsin(x) + rcos(x) + stan(x) + tx^2 + u = 0(0思路: 在定义域内,前面5个都是减函数,所以当F[0] >= 0 && F[1] #include#include#define eps 0.0000000001double p原创 2014-12-07 14:15:53 · 501 阅读 · 0 评论 -
UVA11388GCD LCM
题意: 输入两个整数G,L,找出两个正整数a,b使得gcd(a ,b)=G,lcm(a ,b)=L,如果有多组解,输出最小的a的那组,如果没解,输出-1。思路: 比较简单,如果L%G!=0那么就没解,否则既然要输出最小的a,那么就直接输出G,L就行了,a=G的时候最小,同时b=L的话可以保证最小公倍数是L。#includeint ma原创 2014-12-07 14:05:49 · 402 阅读 · 0 评论 -
UVA11174村民排队问题
题意: 有n个人要排队,给你一些父子关系,要求儿子不能站在自己的父亲前面,问有多少种排队方式?思路: 白书上的题目,首先我们可以把关系建成树,这样我们就有可能得到一个森林(或者是一课树),然后我们再虚拟出来一个点0连接所有森林的根节点,这样是为了保证是一棵树,然后题目就变成了给你一棵树,不改变关系,问这个树有多少种方式,这个还是排列组合问题,对于每一个根节点,原创 2014-12-07 14:29:22 · 980 阅读 · 0 评论 -
UVA11078开放式学分制(前面-后面的最大值)
题意: 给你一个长度为n的整数序列a0 a1 a2..找出两个整数ai,aj(i思路: 简单题目,想象一下,对于每一个数我们只要用他前面的最大的那个数去减他就能得到把他当成aj后得到的最大值,而那个最大的数就是ai,ai是可以线性更新的,所以这个题目我们也没有必要开数组存,直接在输入的时候更新ai,枚举更新答案就行了,具体看代码。#include原创 2014-12-07 14:20:12 · 518 阅读 · 0 评论 -
UVA10943简单递推
题意: 给你两个数字n,k,意思是用k个不大于n的数字组合(相加和)为n一共有多少种方法?思路: 比较简单的递推题目,d[i][j]表示用了i个数字的和为j一共有多少种情况,则d[i][j]=d[i][j] + d[i-1][j] (0#include#includeint main (){ int n ,k原创 2014-12-07 14:05:08 · 411 阅读 · 0 评论 -
UVA11137(立方数之和)
题意: 给你一个n(思路: 一个地推公式,d[i][j] 表示用不大于i的数字去组合j这个数字有多少种方法,因为nd[i][j] = d[i-1][j] + d[i][j-i*i*i];可以这样理解,d[i-1][j]好说,就是不用当前这个数,d[i][j-i*i*i]表示的是用i,同时for(i = j ;j #include#inc原创 2014-12-07 14:28:17 · 979 阅读 · 0 评论 -
UVA10294项链和手镯(等价类计数问题)
题意: 给你一串珠子(连接成了一个环),共有n个珠子组成,你有t种颜色,现在你来给这个珠子染色,问染成项链有多少种方法?染成手镯有多少种方法?在项链里,经过顺时针旋转后相同的算一个,在手镯里,经过顺时针旋转或者沿着对称轴兑换后一样的算一个。思路: 比较典型的等价类计数问题,我们定义两个变量,a是旋转的总个数,b是翻转的总个数,那么根据Burnside和Pol原创 2014-12-07 14:13:28 · 775 阅读 · 0 评论 -
UVA11389巴士司机问题
题意: 有n个巴士司机,然后有2n个活,其中有n个是上午,n个是下午,每个自己都要选择一个上午的和一个下午的,每个活都有驾驶距离,如果一个司机每天的驾驶距离大于d,那么超出的部分就要每个单位距离给加班费r,如果你是巴士司机老板,最少要付给这n个人的加班费是多少?思路: 这个是水题了,白天活最终的晚上给一个最轻巧的活给他,其他的一次类推,这个很容易想到,不解释原创 2014-12-30 17:11:34 · 880 阅读 · 0 评论 -
UVA11464偶数矩阵
题意: 给你一个n*n的01矩阵,你的你的任务是吧尽量少的0变成1,使得每个元素的上下左右之和均为偶数(如果有的话),比如0 0 0 0 1 01 0 0 ---> 1 0 1 0 0 0 0 1 0是变换了3个。思路: 这个题目拿到手的最暴力的反应就是直接搜索枚举所有,那么时间复杂度是O(2^(原创 2014-12-30 17:17:30 · 1082 阅读 · 0 评论 -
UVA11549计算器谜题
题意: 有一个计算机只能保留数字的前n位,你有一个数字k(k思路: 显然这个题目是有循环节的,为什么有循环节?首先我们看下kFloyd判圈#includeint mk[15];void inint(){ mk[0] = 1; for(int i = 1 ;i原创 2014-12-30 17:20:37 · 525 阅读 · 0 评论 -
UVA11991第k次出现的v的下标
题意: 给你一个有n个数的数字序列,然后有m组询问,每组询问是问第k次出现的v在序列里的小标是多少?思路: 简单题目,直接开个二维的容器就行了,标记出现次数可以开个数组或者是一维的容器,没啥想法直接写就行了。#include#includeusing namespace std;map >Ans;mapmark;i原创 2014-12-13 20:13:57 · 833 阅读 · 0 评论 -
UVA11997求前k个和,多路归并问题
题意: 给你一个二维矩阵,n*n的,每次从每一行中拿出来一个,然后加起来组成一个和,一共可以得到n^n个和,要求求出这n^n个和中最小的那n个和。思路: 多路归并问题,先说下多路归并问题,我的理解是有个变量,每个变量都按照自己的变化规律在变化着,每次一旦选用每个变量,那么这个变量就会根据自己的变化规律变化,这种问题我们可以用优先队列来解决,首先我们可以把所有变量原创 2014-12-13 20:14:44 · 500 阅读 · 0 评论 -
UVA11520填充正方形
题意: 给你一个n*n的矩阵,让你往里面添加大写字母,矩阵有的字母已经给填好了,然后要求是每个格子都不能与他相邻的格子的大写字母相同,如果有多个答案,输出从上到下,从左到右所连接的成的那个n*n长度的字符串的ASCII码最小。思路: 大家都知道4色定理吧,四种颜色能把任何地图都画出来,并且相邻的颜色不同,那么这个题目是26种,所以肯定不存在没有解的情况,所以我原创 2014-12-30 17:18:16 · 781 阅读 · 0 评论 -
UVA11462年龄排序
题意: 给你200w个人的年龄,年龄的范围是1-100,然后让你从小到大排序输出所有人的年龄,题目还特意强调输入文件限制25MB,题目内存限制2MB.思路: 比较经典又简单的一个题目了,很早以前就见过了,我们可以开一个数组num[101]的,每来一个年龄a我们就num[a]++,最后输出num[1]个1,num[2]个2...就行了。原创 2014-12-30 17:15:21 · 605 阅读 · 0 评论 -
UVA11427玩纸牌(全概率+递推)
题意: 一个人玩纸牌游戏,他每天最多玩n局,枚举获胜的概率是a/b,每天玩牌只要获胜概率达到p,那么他今天就不玩了,明天接着玩,如果有一天他的概率没有达到p,(没有达到p的话他今天一定是玩了n次),那么他以后就在也不玩了,问题是在平均的情况下,他能玩多少个晚上的牌?思路: 我们可以先算他只玩一天就失败了的概率,P[i][j]表示玩了i次,赢了j次,当j/原创 2014-12-30 17:13:56 · 528 阅读 · 0 评论 -
UVA11384正整数序列(把123..变成0的最小步数)
题意: 给定一个正整数n,你的任务是最少的操作次数把序列1 2 3 4 5...n中所有的数字都变成0,每次操作可以从序列中选择一个活多个整数,同时减去一个相同的正整数,比如1 2 3可以吧2和3同时减少2,得到1 0 1思路: 我们只考虑操作一次的时候,操作一次是不是最大的效果就是剪掉一半,比如1 2 3 4 5 6 7 变成1 2 3 0 1 2 3原创 2014-12-30 17:09:38 · 3151 阅读 · 0 评论 -
UVA11992不错的线段树段更新
题意: 给你一个矩阵,最大20*50000的,然后有三个操作1 x1 y1 x2 y2 v 把子矩阵的值全部都加上v2 x1 y1 x2 y2 v 把子矩阵的值全部都变成v2 x1 y1 x2 y2 查询子矩阵的和,最大值,最小值思路: 首先我们观察,矩阵的行最多20行,那么我们就可以把每一行都建一颗线段树,这样就变成了一个一维的线段树原创 2014-12-30 17:06:44 · 536 阅读 · 0 评论 -
UVA11722(见面概率)
题意: 有一个车站,两个人想要在这个车站见面,第一个人会在t1到t2之间的任意一个时刻到(时间上任意一点概率一样),并且停留w时间,第二个人是s2到s2的时间段到,停留也是w,问两个人的见面概率是多少?思路: 这个应该算是个比较经典的问题了吧,感觉在那看到过,我们建立一个直角坐标系,t1#include#include原创 2014-12-30 17:22:21 · 676 阅读 · 0 评论 -
UVA11636复制粘贴
#includeint main(){ int Cas = 1 ,n; while(~scanf("%d" ,&n) && n >= 0) { printf("Case %d: " ,Cas ++); int now = 1 ,Ans = 0; while(now { Ans ++原创 2014-12-30 17:21:25 · 516 阅读 · 0 评论 -
UVA11375火柴(递推+大数)
题意: 给你n根火柴,问你能组成多少种数字,比如3根可以组成1或者7,组成的数字中不能有前导0,思路: 我们开一个数组,d[i]记录用i跟火柴可以组成多少种数字,则更新状态是这样的d[i+c[j]] += d[i], c[j]就是组成数字j要用的火柴数,这样跟新相当于是在模拟写数字,但是有一点就是不能以0开头,左后当火柴数大于等于6的时候就可原创 2014-12-07 14:11:48 · 791 阅读 · 0 评论 -
UVA11889(给出lcm(A,B)=C中的AC求最小的B)
题意: 给出最小公倍数LCM(A,B) = C中的A,C求最小的B.思路: lcm=(a*b)/gcd,把等号两侧同时除以a得到lcm/a=b/gcd左侧是已知的,右侧的gcd是a的因子中的一个,直接枚举a的所有因子找到答案就行了。#include#include#includeusing namespace std;l原创 2014-12-07 14:06:49 · 1296 阅读 · 0 评论 -
UVA11624大火蔓延的迷宫
题意: 给1个n*m的网格,上面有的点能走,有的点不能走(墙),然后有的点是火源,火源和人一样,每次都是上下左右四个方向蔓延,速度一样是1,火也不可以从墙上跨过去,给你人的起点,终点是只要走到边界就行,就是走出矩阵,问你最小逃生时间。思路: 一开始小卡了一下,过了一会马上反应过来了,这个题算是基本的广搜题吧!我们想下他跟我们见过的最最基本的广搜有什么区别?是不原创 2014-10-16 16:00:29 · 2370 阅读 · 0 评论 -
UVA10382喷水装置
题意: 给你一个矩形的空地,然后有一些圆形的喷水装置,每个装置的圆心都在矩形宽的中间位置,然偶给你每个矩形的圆心位置和半径,问你最少多少个喷水装置可以把矩形的所有编辑都覆盖上。思路: 首先我们要把所有的圆都处理成矩形,也就是每个圆的最大覆盖矩形范围(除了矩形的部分,其他部分没意义,因为只有矩形能接壤上,不然会有空隙),然后变成了最小区间覆盖问题,最小区间覆盖原创 2014-11-02 11:35:26 · 620 阅读 · 0 评论 -
UVA10020(最小区间覆盖)
题意: 给你一个区间[0,m]和一些小的区间[l,r]让你选择最少的小区间个数去把整个区间覆盖起来。思路: 算是比较经典的贪心题目吧(经典于难度没什么对应关系),大体思路可以是这样,我们先把所有的区间按照起点从小到大排序,然后我们定义一个当前覆盖位置pos,初始是0,也就是[0,m]的最左端,然后我们从小区间中找到一个可以覆盖pos点并且右端点最远的一个(记原创 2014-11-02 11:34:32 · 432 阅读 · 0 评论 -
UVA11419 我是SAM
题意: 给你一个n*m的矩阵,上面有一些格子上有目标,我们可以在格子的外面用枪打目标,一发子弹可以消灭一行或者一列目标,问你最少多少枪能把目标打光,并且输出开枪的位置,题目没说spj(特判),但显然是特判。思路: 求最少多少枪好办,就是求最小顶点覆盖,这个大家都知道,关键是求方案,白书上当时说的是什么匈牙利树,表示没听过,没办法,愣是在网上找到一个代码不停的模原创 2014-10-16 19:44:53 · 1010 阅读 · 0 评论 -
UVA10047独轮车
题意: 给你一个独轮车,轮子上有五个扇形,每过一个格子就转过一个扇形,刚开始的时候方向是向北的,绿色上行向下,每一次可以有三种操作,到下一个格子,左转90度,右转90度,每一次操作都花费时间1,问从起点到终点的最小步数,要求到终点的时候必须还是绿色扇形向下,方向无所谓。思路: mark[x][y][col][fx]代表的是在点(x,y)处,颜色是col方向是原创 2014-10-16 16:02:41 · 1122 阅读 · 0 评论 -
UVA11039
题意: 给你一个序列,由n个数字组成,每个数字的绝对值都不相同,然后让你从这n个数中拿出一些数,组成一个绝对值递增并且正负交替的最大序列,问组成的最大序列的最大长度是多少?思路: 比较简单,突破口是所有数字的绝对值都不同,那么我们直接模拟就行了,直接按绝对值sort一遍,然后第一个默认是找出序列的第一个,然后直接看看有多少正负交替的就行了,具体看代码。原创 2014-11-02 11:38:48 · 636 阅读 · 0 评论 -
UVA10340子序列
题意: 给你两个串,问你第二个第一个串是否是第一个串删除0个或多个字母得到的?思路: 直接模拟就行了,在第二个串中去按顺序更新第一个串的下标,好像没说明白啊,不管了,水题,不理解直接看下代码就懂了。#include#includechar str1[1100000] ,str2[1100000];int main ()原创 2014-11-02 11:36:21 · 499 阅读 · 0 评论 -
UVA11729突击战(汇报和执行任务)
题意: 你是一个长官,有一些士兵要跟你先汇报任务后在去执行任务,每次只能接受一个人的汇报,但是每一时刻可以有多个士兵在执行任务,问所有任务执行完要的最小时间。思路: 按执行任务时间从大到小排序来执行就行了,至于为什么贪心的策略是这个我是这么想的,首先任何一个人执行任务的顺序都不会影响他的汇报和干活时间,还有就是(1)如果两个任务的工作时间相等,汇报时间原创 2014-10-16 09:31:21 · 467 阅读 · 0 评论 -
UVA10881蚂蚁
题意: 在一个木棍上有只小蚂蚁,他们的移动速度都是1,移动的时候如果和别的蚂蚁碰面,那么碰面的这两只小蚂蚁会马上掉头继续走,给你每只蚂蚁的初始距离木棒左端点的距离和方向,以及木棍长度,问你t时间后每个蚂蚁的状态。思路: 比较有意思的题,其实对于这个题目,我们考虑下,如果所有的蚂蚁都没有区别,那么两只蚂蚁相遇是不是相当于"穿过去"了?那么有区别的时候呢?其实原创 2014-10-15 23:18:45 · 1164 阅读 · 0 评论 -
UVA10970大块巧克力
题意: 题意,给你一块n*m的巧克力,最终是要把他切成n*m快小蛋糕,问最小切多少刀?每一刀只能把一个整体切成两个整体,不可以把两个整体分成四个整体,就是说只能切一个地方。思路: 额!这个题目要是说思路的话真的不知道怎么说,记得我一开始是想每一刀一定要尽可能的切的长一点,但是自己找了几个数据模拟下发现只要是先把所有长(或者宽)切完然后在一块一块切结果是固定的原创 2014-11-02 11:37:40 · 417 阅读 · 0 评论 -
UVA10125和集
题意: 给你一个集合,让你从里面找到4个元素,使得a+b+c=d,并且找到最大的d。思路: 我们可以吧问题拆开,使得a+b=d-c,这样就能O(n^2)枚举a+b记录出现的和,然后在同样枚举d-c如果出现过并且不冲突,就更新答案,这个方法在白书里叫做什么中途相遇法,其实就是双向广搜的那个思路,我是开了两个容器,mkc[aaa]表示的是aaa出现了几次,aaa原创 2014-11-21 16:40:26 · 725 阅读 · 0 评论 -
UVA10391复合词
题意: 给定一个词典,然后问里面那些是复合词,复合词就是当前这个单词正好是有两个单词拼接而成。思路: 用map来标记是否出现过,然后先按长短排序,把每个单体拆分成任意两个可能的单词(每次拆分的时间可以是O(1)的),然后在看看这两个单词是否在之前出现过,如果都出现过就直接把当前单词放到答案数组里,然后记得break不然有可能当前单词可能有多重组合而成,失误把当原创 2014-11-21 16:41:07 · 488 阅读 · 0 评论 -
UVA11100旅行(大包装小包,问最少多少个包)
题意: 有n个包裹,每个包裹的大小都给出了,然后小的包裹可以装到大的包裹里,问最少装成多少个包裹,装成最小的包裹后还有一个限制就是让包裹数最多的那个包裹最少,就是说尽量都平均分,比如有6个,最少装成3个,平均就是全是2两个。思路: 一开始没看到要求是平均分,按照出现次数sort一遍之后又用了一个map来插入序列,最后用一个O(n*log(n))的方法成功W原创 2014-12-07 14:22:03 · 726 阅读 · 0 评论 -
UVA11021麻球繁衍
题意: 有K只麻球,每只生存一天就会死亡,每只麻球在死之前有可能生下一些麻球,生i个麻球的概率是pi,问m天后所有的麻球都死亡的概率是多少?思路: 涉及到全概率公式,因为麻球的各种活动都互不影响,所以现在只考虑一直麻球,我们假设f[i]是第i天全部都死亡的概率,那么f[i] = p0 + p1*f[i-1] + p2*f[i-1]^2 + ...pn-1*原创 2014-12-07 14:18:29 · 971 阅读 · 0 评论 -
UVA10780幂和阶乘
题意: 输入两个整数n,m(1思路: 比较容易想,一开始手残wa了好几次,我们直接求出m和n!的素数因子和个数就行了,假如s1[a]表示的是n!的素数因子a的个数,s2是m的,则Ans=min(Ans ,s1[a]/s2[a]);这个应该不用解释,很好理解吧!#include#includeint Pri[11000] ,p原创 2014-12-07 14:03:55 · 457 阅读 · 0 评论 -
UVA11020 优势人群(multiset)
题意: 给你N个人,每个人有两个权值,x,y对于某一个人,如果不存在某一个人x' y',x' 思路: 可以在一个二维坐标系上找到规律,所有人都可以映射到二维坐标系上的某一个点,对于任意两个人不同的人(x,y都相等看成一个人)来说,如果他俩都是优势人群,那么他俩肯定存在这样的关系 x y',这样就在坐标系上形成了一个递减的线,还有就是在加人的过程中一定要记住原创 2015-01-08 16:07:41 · 762 阅读 · 0 评论