自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 uva 10759(数论)

题意:有n个骰子,给出一个目标值x,求出得到的所有骰子点数之和大于x的概率。题解:分母肯定是6^n,分子需要dp得到,开一个二维数组f[i][j]表示i个骰子组成和大于等于j的情况有多少种。状态转移方程是f[i][j + k] += f[i - 1][j],然后两个值求最大公约数约分一下就可以了。#include #include #include #define ll long

2015-01-31 22:40:51 580

原创 uva 10491(数论)

题意:有一些门,a个门内是牛,b个门内是车,一开始可以选择一个门,然后在门打开之前,一个人会打开剩下其中c个有牛的门,然后你可以选择继续打开已选择的门或者打开其他没有被打开的门,问得到的是车的概率是多少。题解:两种情况,如果一开始选择的是牛,p1 = a / (a + b),然后选择的是车的概率是 p1 *= b / (a + b - c - 1),另一种是先选择的是车p2 = b / (a

2015-01-31 16:46:09 592

原创 uva 11039

题意:给出n层去盖楼,下层高度一定比上层高度大,且相邻两层颜色不同,然后给出了n个数,正数和负数区分颜色,绝对值代表高度,问最高有几层。题解:直接按数的绝对值排序,然后按顺序取正负不同的数,最多能去多少个。#include #include #include using namespace std;const int N = 100000;int n, fl[N];int c

2015-01-31 16:09:34 553

原创 uva 11636

题意:有n个句子要打印,先手打一遍,问最少复制粘贴几次可以达到目标数量。题解:容易得出答案是log2(n)向上取整。#include #include const int N = 10002;int ans[N];int main() { int n, cas = 1; ans[0] = 0; for (int i = 1; i < N; i++) ans[i] = c

2015-01-31 16:05:25 601

原创 uva 1335

题意:有n个人围成一圈,每个人都有想要ri个不同的礼物,每个人和相邻的两个人的礼物种类不能相同,问最少要多少种礼物才能符合要求。题解:这题不太好想出解决方法,看书上的题解,如果是n偶数,结果就是相邻两人礼物数之和的最大值,这个很好想,因为可以交替的把不同的礼物给两个人也不用担心会重复,而这个最大值刚好是满足条件的下限。但如果n是奇数需要二分出答案,L就是刚才的最大值,而R为了能减少二分次数定为

2015-01-31 14:45:12 881 1

原创 uva 1267

题意:有n个点连成一个树状网络,叶子结点是客户机,其他的是服务器,现在要安装VOA服务器,要求每个客户机到VOA服务器的距离不超过k,且给出了一个已有的VOA服务器,问最少还需要建立几个VOA服务器。题解:先将已有服务器作为无根树的根,递归建树,然后将距离根服务器的客户机都排除,然后将剩下的叶子结点都存下来,根据树的深度建一张表存相应的叶子节点,从最深的叶子节点开始,每k距离建一个VOA服务器

2015-01-31 14:02:27 755

原创 uva 10056(数论)

题意:有n个人投色子,并给出了一件情况的成功概率,从第一个人开始投色子,到最后一个人,周期性循环,直到有人完成了目标情况,问第I个人成功的概率是多少。题解:第I个人成功的概率应该是,第一轮胜利概率k1 + 第二轮胜利的概率k2 + ...直到kn,kn非常小。#include int main() { int t, n, I; double p; scanf("%d", &t

2015-01-29 22:21:11 588

原创 uva 11027(数论)

题意:给一个字符串,把它的所有回文串按字典序排序,然后给了个n,要求输出第n个回文串是什么,如果没有就输出XXX。题解:首先判断是否存在第n个回文串,用一个数组f[i]表示A(i),那么一个字符串的排列方式就有num += A(len) / A(i),其中len是字符串长度,i是指第i个字符的个数,然后先将字典序最小的字母放到两端,然后判断此时剩下的字符串有x种排法,如果x #in

2015-01-29 21:02:45 626

原创 uva 11520

题意:有一个n×n的矩阵,矩阵元素有'.'和大写字母,要求把'.'全部替换为大写字母使每个元素的上下左右的元素和自己不相同,且从左到右从上到下字典序最小,输出矩阵。题解:n最大10,可以暴力,因为要从左到右从上到下字典序最小,所以就按这个顺序枚举字母填进去就可以了。#include #include const int N = 15;char grid[N][N];int n;

2015-01-29 17:44:30 811

原创 uva 12097(二分)

题意:有f + 1个人要来分派吃,每个人得到的派的面积必须相等,且得到的都是整块的而不是拼起来的,问每个人最多得到多少面积的派。题解:二分法,把每块派的面积除以x,并都向下取整加起来是sum,如果sum大于等于f +1说明这个面积是可以的,x增大,否则x减小。#include #include #include using namespace std;const int N

2015-01-29 17:29:35 505

原创 uva 12124(最小值最大)

题意:有一个人有b元,要去买零件,有n个零件,零件有不同的种类,名称,价格,质量,要求每种零件买一个,不超过b元钱,让最差质量尽量好,问最差质量是多少。题解:典型最小值最大,一般用二分法,假设一个数是最差质量,然后带入计算是否符合,如果符合就增大,否则就减小,直到达到临界值。#include #include #include #include #include using

2015-01-29 17:03:35 781

原创 uva 10795(汉诺塔)

题意:汉诺塔问题,有n个盘子大小不同,编号大的更大,有三个柱子可以套盘子,盘子必须小的在大的上面,每次只能移动一个盘子,给出初始状态和目标状态,问最少几步可以从初始状态到目标状态。题解:如果盘子k的初始和目标位置是相同的且编号最大,那么不需要移动,否则需要把编号比k小的放到一个柱子(fin)上,盘子k在另一个柱子(beg)上,剩下柱子(tar)为空,这是一种参考状态,可以通过让盘子的初始状

2015-01-28 22:05:57 704

原创 uva 10375(数论)

题意:给了p, q, r, s四个数字,求C(p, q) / C(r, s)。题解:直接计算,因为乘除运算顺序不定,可以边乘边除。#include #include using namespace std;int main() { int p, q, r, s; while (scanf("%d%d%d%d", &p, &q, &r, &s) == 4) { q = m

2015-01-28 17:59:11 720

原创 uva 10105(数论)

题意:先给出n和k,然后给了从n1到nk个数字,要求输出多项式展开后,(x1^n1)*(x2^n2)...(xk^nk)这一项的系数。题解:不知道怎么做,看了这个人的题解恍然大悟。。http://www.cnblogs.com/scau20110726/archive/2012/12/22/2829012.html#include #include const int N =

2015-01-28 17:38:54 568

原创 uva 11384(数学)

题意:给了n,用最少的操作数可以让序列1, 2, 3 ... , n全变成0,操作是在序列中挑选1个或多个数字减去一个正整数。题解:找规律,保证序列中1 -- n / 2的数不变,然后将剩下的数减n / 2 + 1,这样f(n) = f(n / 2) + 1,递归可解。#include int f(int n) { return n == 1 ? 1 : f(n / 2) +

2015-01-28 17:05:47 502

原创 uva 1352(暴力)

题意:有n个正方体上任意涂了一些颜色,现在要改变一些正方体上的一些面上的颜色使n个正方体在某种旋转情况下可以对应面颜色相同,问最少改变多少个面的颜色。题解:因为最多4个正方体,暴力可行,然后就是考虑24种旋转方式(当两个方向面确定,一个正方体就确定),先让一个正方体确定,根据每种旋转方式改变其它正方体的面,选出改变面的数量最少的。#include #include #include

2015-01-28 16:43:30 529

原创 uva 11464(贪心)

题意:给了一个n*n的矩阵,矩阵元素不是0就是1,需要把尽量少的0变为1,使每个元素的上下左右和为偶数,问改变的元素的个数,如果无解输出-1。题解:因为直接全部枚举会超时,可以考虑只枚举一行的,然后剩下的根据元素周围和是偶数的条件计算出来,然后找出最少改变的数量。#include #include const int N = 20;const int INF = 0x3f3f3f3f

2015-01-28 13:34:05 564

原创 LA 2995(贪心+推理)

题意:给出了n*n*n立方体的六视图,每个单位立方体的六面颜色相同,但不同单位立方体颜色不同,有些单位立方体缺失,字母代表不同颜色,'.'代表无颜色也就是没有任何正方体,问如果能形成这种六视图,剩余的单位立方体的数量最大是多少。题解:这道题不容易想,用排除法,先让立方体是满的,然后根据给出的六视图将直接能看出是空缺的单位立方体先删除掉,然后根据此时的正方体再次由六视图判断,如果有矛盾的情况就可

2015-01-28 13:29:15 829

原创 uva 10881(贪心)

题意:一个长度为L的木棍上有n只蚂蚁,给出了每只蚂蚁的初始位置和朝向,然后蚂蚁开始行走,如果两只蚂蚁相撞,就立刻掉头,直到掉下木棍,问t秒后每只蚂蚁的位置和状态。题解:因为每只蚂蚁会因为碰撞而掉头,所以相对位置是不变的,为了更容易考虑计算,那么相撞的蚂蚁可以看做是对穿而过,得到输出结果时只要按初始的相对位置再对应上不同的蚂蚁就可以了。#include #include using na

2015-01-28 13:12:17 830

原创 uva 11300(贪心)

题意:有n个人坐在圆桌上,每个人有初始金币m[i],金币总数能整除n,每个人可以给相邻的人金币,也可以得到相邻的人给的金币,问最少转手多少金币可以使所有人的金币数量相等。题解:最后每个人手上应该有sum / n个金币,设每个人i得到和失去的金币分别是x[i]和x[i + 1],那么可以得到所有转移金币是x1 、x1 - (m1 - sum / n)、x1 - (m1 + m2 - 2 * su

2015-01-24 23:31:14 624

原创 LA 3708(贪心)

题意:有n个雕塑等距放在一个周长为10000的圆上,现在要再放m个雕塑,要使所有雕塑仍然保持等距,问n个雕塑最少移动总距离是多少。题解:让n个中的一个雕塑不动,作为原点,那么剩下的雕塑需要移动的位置就确定了,然后把圆周长按比例缩小为(n + m),只要把每个雕塑移动到和它最近的整数点位置就可以了。然后再将所有移动的距离按圆周长是1的比例缩小加起来。结果放大10000倍。#include

2015-01-24 23:21:14 614

原创 uva 11729

题意:有一个人给n个人安排任务,交代任务要b时间,执行任务要j时间,交代任务时必须一个一个人交代,但任务执行可以同时进行。问所有人任务完毕最少花费时间。题解:贪心思想,一个人执行任务时间越长应最先交代任务,所以只要按执行时间排序,然后交代时间累加与执行时间比较选出较大值就是结果。#include #include using namespace std;const int N = 1

2015-01-23 18:14:05 634

原创 uva 11292

题意:有n个龙的头,和m个骑士,每个骑士可以砍掉不超过其能力值x的龙的长度的头,且要雇佣这个骑士就要交x,那么最少的雇佣费是多少,每个骑士只能被雇佣一次,且只能砍一个头。题解:龙头的长度和骑士能力值都从小到大排个序,然后贪心得到最少的雇佣费。#include #include using namespace std;const int N = 20005;int n, m, dra

2015-01-23 18:03:24 528

原创 uva 10308(无根树变有根)

题意:给出一些村庄之间的路的距离,每个村庄可以到达任意其他村庄,且所有路中不会有环。问任意两个村庄可达的总路径最长是多少。题解:因为从一个村庄到另一个村庄同一个的村庄不会经过两次,所以村庄和路其实是一棵无根树,用dfs(int a)计算结点a的子结点到a的最大距离,结果就是a的子结点到结点a的最大距离加次大距离。#include #include #include using n

2015-01-12 18:41:45 766

原创 uva 11029

题意:计算n^k的前三位和后三位。题解:后三位可以用快速幂取模得到,前三位计算时 n^k = 10 ^ (k * log10 n)。那么计算10 ^ (k * log10 n)的前三位就是10 ^ (2 + fmod(k * log10 n, 1)),例如10^3.5就是10^3 * 10^0.5,10^3决定10^0.5小数点后移3位,因此10^(k * log10 n)的前三位一定是k *

2015-01-11 20:46:31 824

原创 uva 571

题意:给了a,b两种容量的杯子(a 题解:直接模拟,还有个简便算法,因为a和b互质,那么a * 1 % b到a * (b - 1) % b将会出现1到b - 1的所有数且不重复,那么就会有n的存在(n #include #include int main() { int ca, cb, n; while (scanf("%d%d%d", &ca, &cb, &n) ==

2015-01-09 21:04:37 655

原创 uva 10820

题意:给出一个数字n,问小于等于n的两个数一共有多少个互质组合。题解:先用欧拉函数,求小于等于n的和n互质的数的个数,可以迭代求出小于等于n的互质组合。#include #include #include const int N = 50005;int res[N], n;int main() { res[1] = 1; for (int i = 2; i < N; i

2015-01-08 21:02:32 683

原创 uva 10820

题意:给出一个数字n,问小于等于n的两个数一共有多少个互质组合。题解:先用欧拉函数,求小于等于n的和n互质的数的个数,可以迭代求出小于等于n的互质组合。#include #include #include const int N = 50005;int res[N], n;int main() { res[1] = 1; for (int i = 2; i < N; i++

2015-01-08 21:01:53 601

原创 uva 10717

题意:给出一些硬币的高度,和你要设计的椅子腿的高度,每个椅子的一条腿用不同的硬币来组装,问得到的椅子距离目标值最小的两种高度是多少(小于目标值,大于目标值)。题解:遍历存储所有硬币的每4个组成一组,求出他们的最小公倍数,然后暴力找出距离目标值最小的两种值。#include #include const int N = 55;const int INF = 0x3f3f3f3f;

2015-01-08 19:18:36 787

原创 uva 11081(dp)

题意:给了三个字符串,然后问有多少种方法使第一个字符串的子串和第二个字符串的子串可以组合成第三个字符串。题解:问组成方法数量的dp题总让人心塞。。。看了题解,f[i][j][k]表示第一个字符串前i个字符第二个字符串前j个字符的子串能有多少种方法组合成第三个字符串前k个字符,但是需要添加f1[i][j][k]和f2[i][j][k]分别对应第一和第二个字符串的f数组,使f[i][j][k] =

2015-01-07 16:35:51 597

原创 uva 10558(dp)

题意:一个100*100矩阵上有n个点,给出n个点的坐标,然后划了m条竖线,和m条竖线的坐标,然后问如果要切A条线,必须切1和100这两条线,问怎样切横线可以让区域最多,区域必须是有点存在的,边界上的点属于点右上区域。题解:想不出来,参考网上的人的题解,通过初始化用了个数组s[i][j]表示从第i条横线到第j条横线有多少个区域,然后就可以普通的dp,f[i][j]表示从第i条线到最后且还剩

2015-01-06 21:38:16 619

原创 uva 10280(完全背包)

题意:有wine L的酒要放到n个瓶子里,每个瓶子最少和最多放多少毫升酒给出,如果瓶子是无限多的,问酒最后最少剩余多少毫升。题解:相当于完全背包问题,f[i]表示imL的酒最少剩余多少,因为瓶子的容量是个区间,所以直接把区间变成点,相当于a ~ b毫升的瓶子其实是有b - a个瓶子,容量分别是从a到b,如果只是这样做会超时,因为酒最多会有1000000000ml,可以想一下,给了一个容量是72

2015-01-05 20:04:40 729

原创 uva 10163(dp)

题意:给出了n个仓库,m个人看管,以及每个人的能力值,每个仓库只需要一个人看管,但一个人可以看管多个仓库,每个仓库的安全值是看管人的能力值pi除以看管人看管仓库的数量k,仓库的安全线是所有仓库安全值中最小的那个,总的发放的工资是聘用的看管人的能力和。要求得到在最高安全线和在满足最高安全线条件下的发放工资和最小值。题解:两个数组safe[i][j]表示前i个人看管前j个仓库的最高安全线,f[i]

2015-01-04 21:47:08 690

原创 uva 10817(状态压缩)

题意:一个学校要招聘老师,s门课,已应聘了m个老师,且有n个老师来应聘,给出了m个老师的工资和教哪几门课,和n个应聘者的工资和教哪几门课,要求所有科目至少有两个老师教,问最少花费。题解:用状态压缩表示所有科目是否有老师教,因为每门课最少两个老师,所以状态要用s * 2个位表示,先初始化所有状态为1,然后先输入m的老师信息,将工资和存起来,然后把科目状态更改为0,然后输入n个应聘者的信息,c

2015-01-04 19:56:58 791

原创 uva 10599(dp)

题意:在一个row * col矩阵内,一个机器人从左上角走到右下角,途中要清理垃圾,其中有些格子内放了垃圾,给出了矩阵大小和垃圾的坐标,机器人只能向右或向下走,问找到一种走法可以使机器人捡到的垃圾最多,并且有多少种这样的路径,打印其中一条路径。题解:每个坐标(x, y)代表的位置是(x - 1) * col + y,用f[i][j]表示从(i, j)这个位置走到终点最多捡到多少垃圾,path表

2015-01-03 15:22:55 673

原创 uva 11258(dp)

题意:一串数字,将他们分成小于2^32的负整数,没有前导0的一列数字时所有数字的和最大,输出最大和。题解:f[i]表示前i个数字的和可以组成的最大和是多少,状态转移方程f[i] = #include #include #include using namespace std;const int N = 205;const int MAX = 2147483647;cha

2015-01-01 23:32:57 713

原创 uva 10723(dp)

题意:给两个字符串,然后将这两个字符串合到一起形成一个新字符串,两个字符串在新串中顺序不变,且保证新字符串长度最短,问最短长度是多少,有多少种新字符串。题解:f[i][j]和len[i][j]分别表示str1中前i个字符和str2中前j个字符可以组成的新字符串的种类数量和长度,迭代做法,如果str1[i] == str2[j],状态转移方程f[i][j] = f[i - 1][j - 1] l

2015-01-01 20:31:23 605

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除