- 博客(44)
- 资源 (2)
- 收藏
- 关注
原创 UVa 1303 - Wall
题目:有很多点,修一座最短的围墙把素有点围起来,使得所有点到墙的距离不小于l。分析:计算几何,凸包。 如果,没有距离l的限制,则答案就是凸包的周长了;有了距离限制其实是增加了2*π*l; 证明:如上图,在凸包外做对应边的矩形; 多边形内角和 = 180*(n-2);
2014-08-29 23:54:10 910
原创 UVa 10127 - Ones
题目:求一个全是1组成的最小可以整除n的数。分析:数论,模拟。每次保留mod n的余数乘以10加1即可。说明:每天一水题。#include #include #include using namespace std;int main(){ int n; while (cin >> n) { int value = 1,count = 1; while (val
2014-08-29 22:01:26 1410
原创 UVa 10226 - Hardwood Species
题目:有很多不同名称的树,统计每种树出现的概率。分析:字符串,字典树(trie)。直接利用字典树计数,然后排序输出即可。说明:POJ2418没有测试组数,TLE几次才发现╮(╯▽╰)╭。#include #include #include #include #include using namespace std;char words[32];/* Trie de
2014-08-28 16:54:11 2132
原创 UVa 10344 - 23 out of 5
题目:给你五个数字,在他们中间加上'+','-','*',构成结果23,问能否成功。分析:搜索,24点类似物。 首先,求出五个数的全排列; 然后,按顺序枚举三种运算,计算结果,判断即可。说明:注意优先级,左边的高。#include #include #include using namespace std;int dat
2014-08-26 19:27:48 971
原创 UVa 355 - The Bases Are Loaded
题目:进制转换,加上合法判断。分析:数论。先转化成十进制,再转化成对应的进制,输出即可。 base进制转化成十进制:顺序乘以base加和; 十进制转base进制:逆序输出模base的余数。说明:注意值时0的情况。#include #include #include using namespace std;char numb
2014-08-25 09:16:01 2314
原创 UVa 497 - Strategic Defense Initiative
题目:最大上升子序列,输出一组解。分析:dp,LIS。数据较小 O(n^2)算法即可。 设以第i个数字作为最大上升子序列中的最后一个数的长度为 f(i),则有转移方程: f(i)= max(f(j)) { 0= 用一个数组记录前驱,递归输出即可。说明:注意输出格式有点纠结。#include #include
2014-08-24 23:02:21 2113
原创 UVa 10515 - Powers Et Al.
题目:计算n^m 的最后一位。分析:数论。结果的最后一位,只与n最后一位有关,而0~9的幂都是以2或4为循环周期的。 计算m模4的余数r和n的尾数k,则k^r就是结果。说明:其实也可以用快速幂,不过这个更快(⊙_⊙)。#include #include #include #include using namespace std;int value
2014-08-23 17:03:21 1234
原创 UVa 10298 - Power Strings
题目:求一个串的最大的循环次数。分析:dp,KMP,字符串。这里利用KMP算法。 KMP的next函数是跳跃到最近的串的递归结构位置(串元素取值0 ~ len-1); 由KMP过程可知: 如果存在循环节,则S[0 ~ next[len]-1] 与 S[len-next[len] ~ len-1]相匹配;
2014-08-21 22:36:34 2291
原创 UVa 725 - Division
题目:给你一个数字n,用0~9,10个数字组成两个五位数,使得他们的商为n,按顺序输出所有结果。分析:暴力。直接枚举第二个数字,范围(1000,100000),然后判断即可。说明:直接搜索应该也可以(⊙_⊙)。#include #include #include using namespace std;int used[10];int judge( int a, int
2014-08-21 19:55:22 7551
原创 UVa 531 - Compromise
题目:给你两个文章,求里面最多的按顺序出现的单词。分析:dp,LCS(最大公共子序列)。直接求最大公共子序列,每个单词当做一个元素即可; 注意记录路径:如果匹配成功记录前驱,否则取前面取得的最大值。说明:注意输出时的格式,多打个空格WA了好几次才发现。#include #include #include #include using namespac
2014-08-20 19:15:23 1220
原创 UVa 993 - Product of digits
题目:给你一个整数n,求一个数m,使得m的每个位数的乘积是n,求最小的m。分析:贪心。直接从9到2枚举所有的因数,统计即可。如果还有大于9的素数这输出-1。说明:今天Timus发邮件,说我的这个题目,在那边的解错了╮(╯▽╰)╭。#include #include #include using namespace std;int save[10];int main()
2014-08-18 13:12:03 750
原创 UVa 10487 - Closest Sums
题目:给你n个数字a[1~n],以及m个数字b[1-m],对于每个b[i]找到对应的两个a[j],a[k]使得他们的和最接近b[i]。分析:分治,二分。有两种方式: 1.先计算所有a的组合,然后对于每个b二分求解即可O(n*n*logn); 2.对于每个b,枚举多有的a,利用二分找到最最接近b-a的数即可O(n*m*lgn)。说明:注意一
2014-08-14 03:26:02 950
原创 UVa 920 - Sunny Mountains
题目:有一些山,在一个平面山,给你每个山峰的坐标,太阳从右边照过来,被照到的线段的长度和。分析:计算几何、贪心。首先,按很坐标排序;然后,每次找到左边第一个比它高的山峰, 求出对应的照射长度,求和即可。说明:while(scanf("%d",&t))导致TLE,╮(╯▽╰)╭。#include #include #include #include #i
2014-08-13 17:06:40 1257
原创 UVa 10943 - How do you add?
题目:求一个数字n拆成k个数字的拆法数,可以重复,可以有0。分析:dp,组合数学。 方法1:dp 状态:f(i,j)为 j 拆成 i 个数字的方法数,则有f(i,j)= sum(f(i,k)) { 0 ≤ k ≤ j }; 方法2:计数原理 隔板法:C(n+k-1,k-1)= (n+1)(
2014-08-10 20:27:55 1772
原创 UVa 11292 - Dragon of Loowater
题目:一条龙有n个头,有m个勇者,勇者的能力值大于龙头的大小就能打败他,每个勇者需要能力值对等的佣金, 问使用至少多少钱可以杀掉龙。分析:贪心。首先,将龙和勇者斗都递增排序;然后,每次雇佣当前能力值最小的可以杀龙的勇者即可。 (如果当前的勇者导致不适最优解,则他之前有比他佣金高的,则他一定更早被雇佣)说明:田忌赛马(⊙_⊙)。#incl
2014-08-09 14:37:35 802
原创 UVa 12124 - Assemble
题目:你要去自己买个组装机,现在给你每个零件的类别、名字、价钱、级别,以及你有的钱数, 求能组装成的机器的最大级别(机器的所有零件中的最小级别,即最小值最大)。分析:分治、dp。看起来很像是dp,不过本题可以利用二分求解(我这里二分套二分了)。 首先,将所有的零件按照级别递减排序,此时装机的总代价递减(比原来多了新的参考零件);
2014-08-04 23:02:22 1101
原创 UVa 988 - Many Paths, One Destination
题目:人生有很多选择,现在给你一些选择(0~n-1),和每个选择分支后面的其他选择序号,求选择总数。分析:dp,图论。如果某状态的后续选择个数是0个则,代表死亡,统计所有到达死亡的路径条数即可。 用一个状态数组记录到达每个选择的路径数,它等于能到达它的前驱节点的路径加和。 稀疏图,使用邻接表储存。初始是节点0的路径条数为1,代表出生。说明
2014-08-04 15:55:44 944
原创 UVa 1647 - Computer Transformation
题目:初始给你一个1,然后每一次1变成01,0变成10求变化n步后,有多少个00。分析:数学题。我们观察变化。 00 -> 1010 出现 10、01 01 -> 1001 出现 10、00、01 10 -> 0110 出现 01、11、10 11 -> 0101 出现 01、10
2014-08-04 12:17:44 1743
原创 UVa 11057 - Exact Sum
题目:已知n个数a[1..n],还有另一个数M,在前n个数中找到差值最小的两个数使得他们的和是M。分析:数学。排序,找M/2。然后向两边分别扩展即可。 设a[s]是第一个大于M/2的数字, 如果M是偶数,并且存在至少两个M/2,则a[s-1]、a[s-2]一定是M/2; 否则a[s-1] M,从这两点向两边扩展即可
2014-08-02 10:31:47 1047
SOFA: A Multi-Model Framework for Interactive Physical Simulation
2018-06-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人