02 2012 档案
摘要:题目大意是给定两个整数n和m,求出长度为n+1满足条件的数列data的个数,数列的要求下:1)1<=data[i]<=m,for1<=i<=n2)data[n+1]=m;3)这个n+1个数满足:存在x1,x2,...,xn,xn+1,满足x1*data[1]+x2*data[2]+...+x(n+1)*data[n+1]=1;根据数论的知识,若存在这样的x1,x2...xn+1,则data[1],data[2]...data[n+1]的最大公约数为1证明:若data[1],data[2]...data[n+1]满足题意,并且存在最大公约数d(为整数);则x1*data[
阅读全文
摘要:题意:给出两个字符串 a 和 b ,输出一个满足如下条件的最长串 x:x 的某两个排列分别是 a 和 b 的(不必连续的)子序列。如果有多个 x 满足条件,输出字典序最小的一个。解题思路:首先对两个字符串按字典序排序,然后再进行比较。注意:测试数据含有空格,所以不能用 cin 或 scanf 输入字符串。View Code 1#include<iostream>2#include<cstdio>3#include<algorithm>4#include<cstring>5usingnamespacestd;6chara[1005],b[1005]
阅读全文
摘要:解题思路:这道题考察的是三维空间坐标xyz,必须具有丰富的想象力,像我这种对方向不敏感的人,只好多转转弯,比划比划。只要测试数据能看懂,那么题意就难能理解了。View Code 1#include<iostream>2#include<cstring>3usingnamespacestd;45intmain()6{7intm,n;8cin>>m;9while(m--){10cin>>n;11intx,y,z,l,p,u;12x=y=z=0;//起点(原点)13p=0;//当前方向14l=4;//左边的方向15u=2;//上边的方向16chars[
阅读全文
摘要:题意:给出 n 个点的整数坐标(n<=700),求一条直线,使得在这条直线上的点数最多,输出点数。解题思路:采用几何中的三个点是否在一条直线上判定定理:(yi-yk)/(xi-xk)=(yj-yk)/(xj-xk),除法不能出现分母为0的情况,所以转换为乘法做,即:(yi-yk)*(xj-xk)=(yj-yk)*(xi-xk)(i、j、k共线)。View Code 1#include<iostream>2usingnamespacestd;3#defineMAX7054structPoint{5intx,y;6}p[MAX];7intmain()8{9intn,i,j,k,a
阅读全文
摘要:题意:在他走第 i 次的时候,只按动可以被 i 整除的位置(位置编号为 1 到 n )上的开关。判断最后一个灯泡的最终状态。解题思路:令d(n) 为自然数 n 的因子个数,不及重复的因子。当且仅当 n 为完全平方数时,d(n) 为奇数;这是因为 n 的因子是成对出现的,也即当 n=a*b 且 a!=b 时,必有两个因子 a 、b;只有 n 为完全平方数,也即当 n=a2时,才会出现 d(n) 为奇数的情形。注意:n 的范围:n<=232-1,n 必须定义为 unsigned int 型。View Code 1#include<iostream>2#include<cma
阅读全文
摘要:解题思路:这道题题意很明确,就是从整数 n 开始,如果 n 是偶数,把它除以 2;如果 n 是奇数,把它乘 3 加 1。用新得到的值重复上述步骤,直到 n=1 时停止。计算 i 到 j 之间的整数中,循环节长度的最大值。由于n 是不小于1000 000的整数,所以用递归虽然很方便,但是容易超时,后来改为递推仍然超时。其实想想有的数会重复计算,因此可以用数组保存下来,也就是我们通常所说的打表方法。注意:输出的整数 m 与 n ,不一定是 m<n,所以要做交换,使其满足条件。由于要求输出这两个整数,所以刚开始要保存下来。另外请注意编译环境问题,UVa中不支持__int 64 类型,支持 lo
阅读全文
摘要:解题思路:本题内容虽长,但很好理解。其实就是在矩阵(m*n)中找出在不同行不同列中m个数字的最大和。但还必须满足条件,关键在于后一行的(选中的)数所在的列必须大于该行(选中的)数所在的列。这是道经典的DP,状态转移方程为:dp[i][j]=max(dp[i][j-1], dp[i-1][j-1]+v[i][j]).View Code 1#include<iostream>2usingnamespacestd;3#defineMAX1054#definemax(a,b)((a)>(b)?(a):(b))5intv[MAX][MAX],dp[MAX][MAX];67intmain
阅读全文
摘要:题意:给定一个数n,在1+2+3+4+…+k中,求随意改变加减号能使其和(差)正好为n的k为多少,使得k最小。解题思路:每次累加i: 如果sum小于n则无论如何也不可能达到题意; 如果sum正好等于n则累加到这个k正好为答案;如果sum大于n时,则需要把前面的加号改为减号:如果改为-1,结果就减2,如果改为-2,结果就减4,以此类推,可以看出只要sum-n为偶数,则此时可以改sum结果为n,得答案。View Code 1#include<iostream>2usingnamespacestd;3intmain()4{5intn,i;6while(cin>>n)7{8in
阅读全文
摘要:解题思路:题目意思是找到判断是不是连通无环的图,首先想到的就是并查集。 1》判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。 2》判断连通的时候,只要判断根节点数为1即可。 注意:当输入的这组数据只有 0 0 时,依然是满足条件的,即应输出 "Yes"。View Code 1#include<iostream>2usingnamespacestd;3#defineMAX1000054intfather[MAX],flag,sign[MAX];56intFindSet(intx)7{8while(x!=father[x])9x=fa
阅读全文
摘要:解题思路:题意明确,其实是最小生成树的一种变形,可以在读取输入时将已经建设的道路的费用看做是0,然后直接寻找最小生成树,得到生成树的耗费就是最短耗费。另外注意:用cin、cout输入输出则会超时,本来以为数据量不会太大,但改用scanf和printf后就AC了。 View Code 1#include<stdio.h>2#defineMAX0xfffffff3#definemax10545intmap[max][max],sign[max];6intmain()7{8intn,a,b,c,d,i,j;9while(scanf("%d",&n)&&
阅读全文
摘要:解题思路:题意很明确,就是求起点到终点的最短路,如果存在则输出该距离,否则输出 "-1"。求单源点的最短路径问题,我选用迪杰斯特拉算法,以前用过,所以比较熟悉。可这道题需要注意的地方很多,比如在输入时两个城镇之间可以有多条路,所以必须选择最短的一条;另外,在初始化时,城镇到自身的距离应该0,开始我一直初始化为最大值,在这里栽了很大跟头。以后会注意的。View Code 1#include<iostream>2usingnamespacestd;3#defineMAX0xfffffff4#definemax2055intmap[max][max],sign[max
阅读全文
摘要:解题思路:刚读完这道题后,不懂什么意思,感觉挺奇怪的。看了几遍题后,还是无从下手。通过动笔画画与测试数据结果对住了,觉得应该是这个意思,也确实是的。题目意思的正确理解应当是,从任意位置开始一直取到末尾,然后求其平均值,把这n个平均值中取最大的一个输出。也是按照贪心原则求解问题。 如Sample: 10 2 10 4 6 5 10 10 2 3 2 取 <1> (2 + 10 + 4 + 6 + 5 + 10 + 10 + 2 + 3 + 2 ) / 10 <2>(10 + 4 + 6 + 5 + 10 + 10 + 2 + 3 + 2) / 9 <3>( 4
阅读全文
摘要:田忌赛马,经典的贪心,每次都用最快跟最快的,最慢的跟最慢的进行比较、判断1)若田最快的比王最快的慢,则用最慢的跟王最快的比,输掉一局;反之,则赢了当然是最划算的选择了2)若田最慢的比王最慢的还慢,则用最慢的跟王最快的比,输掉一局;反之,同上。具体解题思路如下:1.当田忌最慢的马比齐王最慢的马快,赢一场先。因为始终要赢齐王最慢的马,不如用最没用的马来赢它。2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场。因为田忌最慢的马始终要输的,不如用它来消耗齐王最有用的马。3.当田忌最慢的和齐王最慢的马慢相等时,分4和5讨论。4.当田忌最快的马比齐王最快的马快时,赢一场先。因为最快的马的用途就是
阅读全文

浙公网安备 33010602011771号