- 博客(63)
- 资源 (2)
- 收藏
- 关注
原创 斐波纳契数列(Fibonacci Sequence)
斐波纳契数列(Fibonacci Sequence) 0.前言很久以前就想写一些竞赛学习的总结,但是由于之前事情比较多,导致计划不断的减缓。现在,大学教学任务的考试已经全部结束了,而比赛也告一段落,所以有时间来整理一下之前学过的东西。不久前,在做比赛的时候遇到了这样一个问题:求出第N个斐波纳契数的前M位和后K位。所以就将斐波纳契数列(Fibonacci Sequence)作为第一步
2012-11-25 14:21:15 6246
原创 UVa 11347 - Multifactorials
题目:求一个数字n多阶乘的因子的个数。分析:组合数学、数论。求出所有的素数因子的个数,然后利用组合数公式求解即可。结果为π(pi+1),其中pi为第i个素数因子的个数。注意:数据过大会超出整形,但是利用double即可。#include #include #include char c[1005];int f[1005];int p[1005];int u[10
2012-11-29 20:11:45 1752
原创 UVa 10334 - Ray Through Glasses
题目:求在3快玻璃间反射k次的光线条数。分析:找规律,fib。可以找到规律,f(k) = f(k-1)+f(k-2)。光线分为两种:距离外阶有1层玻璃和距离外界有2层玻璃。距离外界有2层玻璃的光线是上次反射出去的光线,距离外界有1层玻璃的光线是上上次反射出去的光线,所以满足fib数列。注意:数据较大有208位,要用大整数模拟。#include #include #include
2012-11-29 19:57:04 1434 3
原创 UVa 763 - Fibinary Numbers
题目:斐波那契进制加法。分析:模拟、大整数。先将两数装换成10进制加和,再转化回Fib进制数即可。注意:fib(100)超过long long类型。#include #include #include char a[105];char b[105]; int F[105][31];int c[105];int V[31];int cmp( int *a, in
2012-11-29 19:18:23 1264
原创 UVa 481 - What Goes Up
题目:最大上升子序列。分析:dp、lis、二分、单调队列。LIS的O(nlogn)算法。此算法,利用单调队列+二分优化。单调队列里的元素Q[i]为,到目前为止、长度为i的LIS中最小的结束元素。运行过程中,如果当前元素小于队尾元素,则可以和前面的构成LIS,直接加入队尾,否则替换之前的长度相同的LIS的结尾元素,使对应位置上的元素变小,由于队列满足单调性,所以利用二分查找提高效率。例如:序列为
2012-11-27 14:45:27 2264
原创 UVa 10340 - All in All
题目:判断a串是不是b串的子串。分析:暴力。直接利用一根指针跟踪a串即可。时间复杂度T = O(min(len_a,len_b))。注意:要利用cin,用scanf会TLE。#include #include #include using namespace std;char str[ 100005 ];char val[ 100005 ];int main(){
2012-11-26 14:13:37 3093 3
原创 UVa 10305 - Ordering Tasks
题目:求出满足对应顺序的序列。分析:图论、拓扑排序。知道起点用dfs效果更好,不知道可以暴力。#include #include #include int edge[105][105];int list[105];int used[105];int main(){ int n,m,a,b; while ( scanf("%d%d",&n,&m) && n ) {
2012-11-26 13:00:41 1067
原创 UVa 10192 - Vacation
题目:最大公共子序列或最大上升子序列。分析:dp、LIS或LCS。LIS和LCS之间课转换,按串1的顺序求串2的LIS即可。#include #include #include char str[ 128 ];char val[ 128 ];int f[ 128 ][ 128 ];int main(){ int T = 1; while ( gets(val) &
2012-11-26 11:27:45 854
原创 UVa 11151 - Longest Palindrome
题目:求最常回文子串。分析:dp、LCS,求一个串的最常回文子串就是本串与翻转串之间的最大公共子序列。注意:数据中有空串。#include #include #include char string[ 1005 ];char revstr[ 1005 ];int f[ 1005 ][ 1005 ];int main(){ int T; while ( scan
2012-11-26 03:41:27 1459
原创 UVa 443 - Humble Numbers
题目:求由{2,3,5,7}组成那的数字集合的第n个数字。分析:利用4根指针,对应每个数字当前对应的因子,每次取最小的数值,指针后移。注意相等的情况。注意:输出的计数法。#include #include #include int d[ 5850 ];int v[4] = {2,3,5,7};int p[4] = {1,1,1,1};int main(){ in
2012-11-26 00:55:27 1751
原创 UVa 350 - Pseudo-Random Numbers
题目:随机数产生器 L = (L*Z+I)%M。分析:简单题、模拟。很多计算机上的随机数就是利用循环节等于M的四元组构造出来了,而L通常取当前时间。注意:初始的L不一定是循环节中的元素。#include #include #include int used[ 10001 ];int main(){ int Z,I,M,L,C = 1; while ( scanf("%
2012-11-25 13:49:20 2700 4
原创 UVa 324 - Factorial Frequencies
题目:计算n!每位上的数字出现的次数。分析:简单题、模拟。大数计算,先计算大数阶乘,然后统计即可。注意:366!有760位左右,注意数组大小。#include #include #include int ans[ 201 ];int bit[ 10 ];void countbit( int f, int v ){ if ( !f ) { while ( v ) {
2012-11-25 13:13:54 1558
原创 UVa 623 - 500!
题目:大整数阶乘计算。分析:简单题、模拟。大数计算,可以采用位数压缩,节约时间空间。把k位存入一位,每次10^k进位即可,利用%0kd输出很方便。注意:500!有2632位,位数开少会WA。#include #include #include int ans[ 451 ];int main(){ int N; while ( scanf("%d",&N) != E
2012-11-25 12:56:22 1024
原创 UVa 10591 - Happy Number
题目:求一个数每个数位上数字的平方和,为最后是否能转换化1。分析:简单题、数论。求循环节。因为9^9*9 #include #include #include int used[ 1000 ];int bitsv( int v ){ int sum = 0; while ( v ) { sum += (v%10)*(v%10); v /= 10; } retu
2012-11-25 12:25:45 978
原创 UVa 543 - Goldbach's Conjecture
题目:歌德巴赫猜想,给出一个数字给出两个奇素数使得和为这个数字。分析:简单题、数论。首先打表求出1000000以内的素数,然后枚举即可。#include #include #include int used[ 1000005 ];int prim[ 1000005 ];int main(){ int n,count = 0; memset( used, 0, sizeo
2012-11-25 12:07:09 1122
原创 UVa 374 - Big Mod
题目:求 (B^P)mod M。分析:简单题、分治。快速模幂算法。注意:P可以为0,要特判,否则会RE。#include #include int spow( int b, int p, int m ){ if ( p == 0 ) return 1; if ( p == 1 ) return b; int a = spow( b, p/2, m ); if ( p%2
2012-11-25 11:44:13 1566
原创 UVa 10346 - Peter's Smokes
题目:有n根雪茄,每次抽完会剩下一部分,剩下部分的k根还可以组成一根,问一共可以出现多少根雪茄。分析:简单题。利用一个变量last储存当前剩下部分的数量,则可以组成新的雪茄数量就是last/k,新的剩下的部分是last/k + last%k(新组成的剩下的部分+上次没有组成新的雪茄的剩下的部分)。#include #include #include int main(){ in
2012-11-25 11:08:37 1245
原创 UVa 11495 - Bubbles and Buckets
题目:求给定序列的逆序数。分析:分治、逆序数、归并排序。利用mergesort求逆序数,时间复杂度O(nlogn)。一个序列的逆序数 = 左半序列的逆序数+右半序列的逆序数+两半之间的逆序数。因为每半序列是排好序的,所以逆序数为合并时每次选择右半段序列的元素时,左序列还留有的元素个数。#include #include #include int P[ 100005 ]; int
2012-11-23 17:57:23 1583
原创 UVa 116 - Unidirectional TSP
题目:求从左到右的一条路径上的加和最小。每次可以采取本行、上行和下行的走法。分析:dp。数塔变形,由于要求最小序列,所以采取从右向左dp、可以保证右边的都是最小序列,每次记录后继节点,输出即可。注意:在最上和最下两行有可能行的编号编程最大和最小的。#include #include #include int mat[ 12 ][ 102 ]={0};int sum[ 12
2012-11-22 15:18:48 880
原创 UVa 10928 - My Dear Neighbours
题目:求一个有向图中出度最少的节点。分析:简单题、图论。统计每个节点度数,比较大小输出。注意:有向图。#include #include #include int edge[ 1005 ]; int main(){ int T,P,M; while ( scanf("%d",&T) != EOF ) { getchar(); for ( int t =
2012-11-22 10:38:33 1017
原创 UVa 105 - The Skyline Problem
题目:在一个平面上给出n个底边共线的矩形,求出所有的高度的转折点。分析:简单题、暴力。由于数据范围是:区间个数5000、区间大小10000,直接利用10000的数组记录每个点的高度,不断在上面更新,最后扫描一遍数组即可。注意:如果h[i-1] #include #include #include int H[ 10005 ] = {0};int main(){ int
2012-11-21 10:02:19 2527
原创 UVa 111 - History Grading
题目:最大公共子序列。分析:dp、LIS或LCS。最大上升子序列或最大公共子序列。当元素不重复时LCS可以转化为LIS,对应B序列每个元素转化为在A序列中的位置,求转化后序列的LIS即为两序列的LCS、可以用单调队列优化为O(nlogn)。注意:输入给的是元素对应的顺序号需要转换、输入时使用while( cin )会导致WA。LCS:#include #include #i
2012-11-20 21:27:43 645
原创 UVa 10055 - Hashmat the Brave Warrior
题目:输出差值的绝对值。分析:简单题。注意:数据类型要用long long、不要使用abs()。#include #include #include int main(){ long long a,b; while ( scanf("%lld%lld",&a,&b) != EOF ) if ( a > b ) printf("%d\n",a-b); els
2012-11-20 18:31:27 1275
原创 UVa 10071 - Back to High School Physics
题目:输出输入乘积的2倍。分析:简单题。OvO。#include #include #include int main(){ int a,b; while ( scanf("%d%d",&a,&b) != EOF ) printf("%d\n",2*a*b); return 0;}
2012-11-20 18:19:38 763
原创 UVa 458 - The Decoder
题目:输出加密串的原串。分析:简单题、字符串。简单的加密,加密原则为加一个定值。#include #include #include char string[10005];int main(){ while ( scanf("%s",&string) != EOF ) { int len = strlen(string); for ( int i = 0 ; i <
2012-11-20 18:16:24 1587
原创 UVa 10783 - Odd Sum
题目:求给定区间内的奇数之和。分析:简单题。1+3+...+2k-1 = k^2。#include #include #include int main(){ int T,a,b; while ( scanf("%d",&T) != EOF ) for ( int t = 1 ; t <= T ; ++ t ) { scanf("%d%d",&a,&b); if
2012-11-20 15:01:33 857
原创 UVa 562 - Dividing coins
题目:给定m个硬币分成两组,求两组和的最小差值。分析:dp、背包。经典01背包模型,把硬币看成体积和价值相同的物品即可,利用背包求出总和一半的价值的容量能取得的最大价值,然后sum-2*f[sum/2]即为结果。#include #include #include int coin[ 105 ];int f[ 50005 ];int main(){ int n,m; w
2012-11-20 14:39:28 736
原创 UVa 160 - Factors and Factorials
题目:求出n!的所有素数因子的个数。分析:简单题、数论、打表。利用筛法先打素数表,然后一次统计即可。注意:输出格式有点纠结。#include #include #include int prime[ 105 ];int table[ 105 ];int ouput[ 105 ];int main(){ //计算素数、筛法打表 memset( table, 0 ,
2012-11-20 14:34:22 2090
原创 UVa 336 - A Node Too Far
题目:统计从某一点出发,走k步走不到的节点个数。分析:最短路、bfs、队列。利用bfs扩展的节点就是按照步长的递增序扩展。注意:数组开大会TLE、开小会RE。#include #include #include typedef struct lnode{ int point; lnode *next;}lnode;lnode Node[ 10000 ];ln
2012-11-20 02:36:18 1290 8
原创 UVa 113 - Power of Cryptography
题目:求已知k的n次方p和n,求k。分析:模拟、二分。模拟大数乘法和比较,利用二分寻找k。如果n很大可利用快速幂。注意:cstring和string.h中没有strrev函数、数据要用LL防止溢出。#include #include #include using namespace std;typedef long long LL;LL p[ 205 ];LL
2012-11-18 16:24:46 1273
原创 UVa 108 - Maximum Sum
题目:最大子矩阵和。分析:dp、最大字段和。二维的最大字段和。将问题转化为一维即可,即从第i列到第j列的最大字段和。所以预先对每行的第i到第j列求和,求每行的第i列到第j列的最大字段和。然后找到max[i][j]中最大的即为答案。时间复杂度O(N^3)、暴力O(N^4)。注意:暴力枚举会TLE。#include #include #include int dat[101][10
2012-11-18 15:04:42 1707
原创 nyist 600 - 花儿朵朵
题目:给定很多花的开花时间段,询问某一时间点有多少朵花儿开放。分析:线段树、离散化。利通每朵花的开花时间段的端点值将时间轴分割成区间段,则操作以每个区间段为整体进行。分割又两种方案:1.端点各成一段,端点间各成一段;2.建立左闭右开的区间,每个区间从上一个顶点开始、到下一个顶点之前结束(开区间)。本题采用方案2,方案一需要生成4倍花儿的数量,而方案2只需要2倍花儿的数量,空间复杂度会降低一倍。
2012-11-18 12:01:26 883
原创 UVa 136 - Ugly Numbers
题目:求由1、2、3和5相乘组成的数字的第1500个。分析:简单题。新的元素一定由原有元素和因子乘积得出。对于每个因子设置一根指向已求得序列的指针。每次取指针对应元素和因子乘积最小的,对应指针后移,重复跳过。时间复杂度为 O(集合大小*序列长度)。#include #include #include int d[ 1505 ];int main(){ int p2 =
2012-11-18 02:55:51 2753
原创 UVa 11402 - Ahoy, Pirates!
题目:给定一个01串,对串的某些区间进行:变0、变1、取反和查询操作。分析:线段树、离散化。经典的线段染色的变形。区间大小1000000,查询操作1000,如果直接建立1000000的区间的线段树,在上面操作会TLE。因为查询只有1000个,那么利用查询的端点将区间划分成最多4001段(每个端点各是一段、相邻端点间的部分各是一段)。对于所有操作,每段都可以看做一个整体。因此,通过离散化可以建立
2012-11-18 02:05:31 1891
原创 UVa 100 - The 3n + 1 problem
题目:给定递归方程,求某区间中的数字的最多迭代次数。分析:简单题、打表。首先可以求出(0,1000000)所有数字的最多迭代次数为525,所以直接打表求出所有结果。之后,每次读入数据直接查询输出即可,貌似不打表的更快。注意:输入数据的两个数字大小关系不定。#include #include #include int S[ 1000000 ];int f( long lo
2012-11-16 02:57:24 860
原创 UVa 102 - Ecological Bin Packing
题目:三种灯放在三个箱子里,求最少的移动灯的数量,使得每个箱子中只有同一种灯。分析:简单题、暴力。枚举所有情况,求出最小值即可。#include #include #include char type[6][4] = { "BCG","BGC","CBG", "CGB","GBC","GCB"};int table[6][9] = { 0,1,1, 1,1,0, 1,
2012-11-16 02:27:36 2399
原创 UVa 11297 - Census
题目:给定一个矩形的数组,在不断更新的过程中查询最值。分析:线段树。利用矩形的左上和右下2个顶点代表对应的矩形,建立矩形树。把每个矩形分成四个小矩形。设x3=(x1+x2)/2;y3=(y1+y2)/2,则矩形{(x1,y1),(x2,y2)}的四个孩子分别为{(x1,y1),(x3,y3)},{(x1,y3+1),(x3,y2)},{(x3+1,y1),(x2,y3)},{(x3+1,y3+
2012-11-15 23:12:57 1550
原创 UVa 11235 - Frequent values
题目:查询某非递减序列,某些区间中的众数出现的个数。分析:线段树、离散化。把相同的数字看成一个节点,建立不等分区间树。区间树的节点储存:区间的端点和此区间中的众数的个数。注意:离散化后并不经过映射建立等分线段树,而是利用原序列中的重复元素的端点建立区间树。#include #include #include #include using namespace std;i
2012-11-15 02:01:20 1472
原创 UVa 11503 - Virtual Friends
题目:求并查集元素的个数。分析:哈希表、并查集。利用hash表建立名字和对应数值的关系。利用一个数组记录集合中元素个数,每次合并,把元素个数加到根上即可。注意:如果查询在同一集合,也要输出 。#include #include #include #include #include using namespace std;//union_set__begein
2012-11-14 19:40:28 965
原创 UVa 11635 - Hotel booking
题目:求从起点到终点住过的hotel最少次数。分析:最短路、优先队列。利用spfa和优先队列求解。如果不用优先队列,则有n*h*t种状态,定会TLE,因此利用优先队列并利用优先队列的性质加以优化。优先队列元素的权值为二元组分别代表住过的Hotel数和从Hotel或起点出发后走到当前节点所有的时间。其中hotel的优先级高,所以程序是按照hotel递增的顺序运行的,和bfs时扫描的节点是相邻层的
2012-11-14 14:27:20 1182
SOFA: A Multi-Model Framework for Interactive Physical Simulation
2018-06-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人