uva
DickensTone
这个作者很懒,什么都没留下…
展开
-
uva 12124
找出最大的质量。利用二分查找,找每一个配件高于中间质量的价格最低的型号。#include#include#include#includeusing namespace std;const int maxn = 1000 + 5;struct components{ int price; int quality;};int cnt, n, tot;map ID原创 2017-08-25 14:28:41 · 275 阅读 · 0 评论 -
uva 12168
这一题是树形dp,说是dp,感觉还不如说是暴力回溯。参考紫书。#include#include#includeusing namespace std;const int maxn = 100000 + 5;vector sons[maxn];int n, t;int dp(int n){ if(sons[n].empty()) return 1; int k =原创 2017-09-11 19:41:22 · 303 阅读 · 0 评论 -
uva 1382
题意:找一个矩形,使得矩形的边上拥有最多的星星。输出星星的数量。这一题依旧用维护的方法做。l[i]为竖线i左边上下界上的点。on[i]为竖线i上,不在上下边界的点的数量。on1[i],则包含上下边界。如直线a,b。on的话为1,on1为3。那么矩形abdc边界上点的数量为l[AB] + on1[AB] + on[CD] - l[CD]。说起来,细节还是挺多的,参考厚白书。原创 2017-10-10 16:50:30 · 285 阅读 · 0 评论 -
uva 10859
参考厚白书题意:有一个城市需要安装灯,只能安装在节点。每一个节点的灯可以照亮与节点相连的街道。给你n个点和m条由节点组成的街道。(不会有环和重复)。求最小的安装数量,和在安装数最小的条件下尽量多有不止被一个灯照亮的街道。只能佩服厚白书的无边法力,我们可以给灯的权重赋一个较大值,给被一个灯单独照亮的街道赋一个较小值,这样求满足要求的最小值就可以了。dp时的状态转移要考虑,若父节点有灯转载 2017-10-27 19:56:14 · 298 阅读 · 0 评论 -
uva 1610
题意:给一个数字n。输入n串字符。你需要给出一串字符x,可以把n串字符分为两份。一份 x。首先考虑x最短,其次考虑字典序最小。思路:最先可以想到的是,把字符串排序,找到最中间的两串。接下来比较麻烦的是如何通过比较两串得到x。设s1, s2为中间的两串字符串且s1 一:比较的字符是否是s1串的最后一个。二:比较的字符是否差别是大于一且比较字符为s2的最后一个字符:如s1 = ABCC原创 2017-10-16 20:03:38 · 333 阅读 · 0 评论 -
uva 1629
题意:给一个由方格矩形,有的方格里面有樱桃。你的任务是沿着方格线进行切割,要求只能直切不能拐弯,使得每个矩形里有且只有一个樱桃。每切一刀的长度是,线的长度,求最小的长度。这一题,一开始不知道怎么做,我一看题解,大部分都是暴力。这一题暴力的关键在于,控制好切割边界。因为输入的是方格,所以我们可以加一条辅助线。/**TASK: milk3ID: DickensToneLANG: C++转载 2017-10-21 09:40:44 · 341 阅读 · 0 评论 -
uva 1394
题意:给n个人,依次编号为1 -> n。给n, k, m。k代表每隔k个人杀一个,m代表从m号开始杀。这一题的思维难度要大一点,首先得知道,f[n] = (f[n - 1] + k) % n,这个公式怎么来。n个人,我们从编号为0 -> n - 1。这样从0开始数,第k个人即k-1号会被杀(当然k-1得存在才行)。这样k号将变为0,编号依次递增,即编号依次减k(小于k需要从n-2开始)。这样第原创 2017-10-22 10:39:42 · 219 阅读 · 0 评论 -
uva 10635
题意:有一块n*n的地图,从(1, 1)出发,到(n, n)。王子和公主,有不同的走法。国王觉得他们是兄妹,就应当尽量在一起。所以,在他们的走法中找出最长公共子序列。这一题,就是求最长公共子序列。但是由于数据有点大,不怎么好动手。不过,由于每个人走的元素都不相同,所以可以把格子的编码重新排序。这样,我们就比较容易的利用LIS得出解。(纯属按照厚白书套弄)#include#incl转载 2017-10-22 15:04:54 · 337 阅读 · 0 评论 -
uva 1329
题意:给一个数字n。接下来有一些操作E a,代表你要输出a到根节点的距离。I a, b。代表把a的父节点设为b。两个节点之间的距离为|a的序号-b的序号| % mod。参考厚白书:就是并查集,不过得记录距离。需要注意的是,压缩路径的时候,要注意更新距离,毕竟根节点可能会变化。#include#include#includeusing namespace std;co转载 2017-10-30 18:46:30 · 245 阅读 · 0 评论 -
uva 10375
这个题参照紫书。惨惨惨,由于数组越界,一直wa,为什么找了很久,因为我坚信我数组一定没有越界。回到问题,C(m, n) = m! / ((m − n)! n!), 数好大! 参考紫书知道了用唯一分解定理,N=P1a1P2a2P3a3......Pnan,这里P1P2P3......Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式。比如7 = 7^1, 9 = 3 ^2原创 2017-09-19 17:11:12 · 354 阅读 · 0 评论 -
uva 1395
题意:给n个节点,m个边和边的权重。问你是否有n-1边, n个点形成的一棵树, 叫T树。若果有,输出最小的苗条值。如果没有,输出-1。苗条值为树中最大边的权重减去最小的。这题就关注两个点:是否可以形成T树,和树中的最大权重和最小权重。我们可以把边进行排序。利用并查集,若边合并一次,那么就多了一个节点连在一起。n个节点,进行n - 1次合并(题目已说,给的边不会有自环和重边)转载 2017-09-26 17:06:03 · 245 阅读 · 0 评论 -
uva 1267
首先要看清题,tree,这样可以省很多麻烦。建立站点的时候,从离树根最远的地方开始计算k倍关系。#include#include#includeusing namespace std;const int maxn = 1000 + 5;vector gr[maxn];vector nodes[maxn];int fa[maxn], covered[maxn];int n, s,转载 2017-08-25 20:18:46 · 230 阅读 · 0 评论 -
uva 1347
参考紫书。假设有两个人,选择不同的点,那么到终点时,他们的路径和,就是答案。因为dp[i][j] = dp[j][i]。所以我们可以只考虑 i > j。dp[i][j] 由 dp[i + 1][i](dp[i][j] 下一步 j -> i + 1) 和 dp[i + 1][j]转移而来。#include#include#includeusing namespace std;转载 2017-08-22 18:19:34 · 204 阅读 · 0 评论 -
uva 12563
几乎和紫书的代码一样,就是一个背包题,唯一难点就是在算歌曲数目。利用异或运算,交替从状态推出状态,用完全背包的知识,就是得装满。#include#include#includeusing namespace std;const int maxn = 50 + 5;int song[maxn];int dp[2][maxn * 180 + 5];int main(){ int转载 2017-08-23 22:21:51 · 338 阅读 · 0 评论 -
uva 10791
参考紫书:先贴一个唯一分解定理的公式:N=P1a1P2a2P3a3......Pnan。题意:给一个数n,求出一些数,他们的最小公倍数为n(至少两个数)。那么根据唯一分解定理,这些数就是P1a1P2a2P3a3......Pnan。因为这些数是互质的,所以他们就是n的最小的因子们。求因子的时候最多有一个因子大于floor(sqrt(n) + 0.5)。如果有两个他们的乘积不是比n还转载 2017-09-22 19:36:11 · 296 阅读 · 0 评论 -
hdu 2412
一题树形dp,思想难度要大一点,需要头脑清晰的分析。编程实现并不难。首先,得考虑用什么来保存状态。用d[u][k], k = 1,表示选择了u,k = 0时表示不选u。选不选的状态定好之后,接下来判断方案是否唯一。f[u][k] 如果为1,那么方案唯一,否则不唯一。先实现的时候还需考虑,如果是d[u][1]的情况,那么f[u][k]由d[v][0]来决定。如果是d[u][0]的情况那么要分情况转载 2017-09-15 14:10:54 · 353 阅读 · 0 评论 -
usaco Mixing Milk
水题,水题,不多说。每次选择最便宜的就可以了。/**TASK: milkID: DickensToneLANG: C++**/#include#include#include#includeusing namespace std;const int maxn = 5000 + 5;struct node{ int cents; int tot;原创 2017-09-24 16:12:40 · 178 阅读 · 0 评论 -
uva 1398
这个题要想办法把它的每个流星在相机里出现的时段算出。把进入的时间和离开的时间存入event。sort之后,从头扫描维护。若进入一个那么流星个数加一,若离开一个,个数减一。不用算出是谁进入谁离开。但是若在一个时间,有流星同时离开和进入,需要好好考虑一下。因为是同时发生,所以如果维护方法有误,可能翻车。/** PROG:milk2 LANG:C++ ID:DickensTo转载 2017-09-17 18:44:07 · 249 阅读 · 0 评论 -
uva 1121
题意:给n个正整数,正整数s。求出1 -- > n之中最小的连续序列,使得他们的和大于s。这一题厚白书上有详细的推导过程,我来捋一捋。若直接用二重循环,一个数一个数的判断,时间复杂度太高。可以使用前缀技巧,求出A[n]为前n个数之和。这一下我们用二重循环就方便多啦,从1开始到i,找出最大的j 使得 a[i] - a[j] >= s。可是时间复杂度也挺高。因为都是正整数,那么A数组肯定是转载 2017-09-26 10:12:37 · 270 阅读 · 0 评论 -
uva 10891
转自法力无边的厚白书。题意:给出一个n个数的序列,两个人轮流从左端或右端开始取任意数。求第一人的数减去第二个人的最大值。这一题,我们考虑从左边取还是从右边取,取多少个数。可以枚举每个状态。dp[l[[r],表示从l到r,最大可以得到的数。它可以由dp[k][r], dp[l][m]得来,k = l + 1---> r m = l ---- >r - 1。k和m相当于枚举取 n - 1转载 2017-10-24 10:51:21 · 276 阅读 · 0 评论