摘要: 解题思路:题意很明确,就是让求满足条件:1、第一个数必须是1;2、相邻两个数之差不大于2 的排列的种数。可以得出递推公式:f[i]=f[i-1]+f[i-3]+1,其中 f[n]即为所求。View Code 1#include<iostream>2#include<cstdio>3usingnamespacestd;45intmain()6{7inti,n,f[60];8f[1]=1;9f[2]=1;10f[3]=2;11for(i=4;i<60;i++)12f[i]=f[i-1]+f[i-3]+1;13while(cin>>n)14{15cout&l 阅读全文
posted @ 2012-03-28 09:17 笑巧 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 解题思路:由于n的范围在1~100,000,000,所以利用常规的每次保存上次运算结果的方法绝对会TLE。题中mod7,即为解题的突破口,由于mod 7 所以f(n)的值只可能有7种结果(0~6),另由f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7,其中A * f(n - 1) + B * f(n - 2)的结果所构成的序列的周期最多不过49,因为由排列组合的原理,f(n-1) 有7中结果,f(n-2)有 7种结果,可得共49种变化。可以把每个结果保存在数组中,直到发现数组的值又变回f(n)=1,f(n-1)=1;时 阅读全文
posted @ 2012-03-28 09:10 笑巧 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 解题思路:看过题就知道是要找规律的,而从下列式子中不容易发现, S(1)=1, //在s(n)从左往右看 S(2)=11, s(1)中有1个1; S(3)=21, s(2)中有2个1; S(4)=1211, s(3)中有1个2和1个1; S(5)=111221,s(4)中有1个1、1个2和2个1; S(6)=312211, s(5)中有3个1、2个2和1个1;……让求s(n)的长度,首先必须找出 s(n)的组成结构,其实仔细一看,会发现s(n)的组成是跟 s(n-1) 密切相关的,过程如上所述。由于 n<=30,数据不大,我就定义了一个二维字符数组来保存s(n)的所有信息,然后就可以求出 阅读全文
posted @ 2012-03-21 09:20 笑巧 阅读(485) 评论(0) 推荐(0) 编辑
摘要: 题意:找出最小的正整数 x,输入一个整数 n ,能找到一个整数 y ,满足 y2=n+x2 ,题目要求 n<=109 。解题思路:如果要按正常方法从小到大遍历,由于数据量大一定会超时。其实上述式子转化后可以分解因子:n = ( y - x )*( y + x ) ;令 y - x = i,所以有 x + y = n / i ,即 ( n / i - i ) / 2 = x. 注意:x 要大于 0 ,当 n 是完全平方数时要注意。View Code 1#include<iostream>2#include<cstdio>3#include<cmath>4 阅读全文
posted @ 2012-03-21 09:06 笑巧 阅读(459) 评论(0) 推荐(0) 编辑
摘要: 解题思路:刚开始读不懂题意,不知道到底让求什么,看着测试数据也很奇怪。根据题意,目的要求是“多退少补”,那么可以把学生分成两组,一组是垫付的费用大于平均费用的,一组是小于等于平均费用的,垫付多的学生应该退还钱款,垫付少的应该收取费用。而所求的是需要最少的那部分。即让求每个学生平摊支出所需的最小总“交易”金额。首先计算“平均费用”,由于要求支出差距在1分钱以内,故可以考虑在计算时取小数点后两位,对于第三位以后的数采用四舍五入的方法。可以截取浮点数中的部分小数位:sprintf( tmp, "%.2lf", ave); sscanf( tmp, "%lf", 阅读全文
posted @ 2012-03-14 09:22 笑巧 阅读(320) 评论(0) 推荐(0) 编辑
摘要: 解题思路:题意很明确,就是依据日程安排找出最长的可能打盹的时间。其实就是把所有空闲的时间排序(先要对日程安排时间从小到大排序,然后计算出可能的打盹时间),然后找到最长的即为所求。需要注意的是:时间从 10:00 开始,到 18:00 结束,在计算过程中一定要把边界考虑上。我定义了两个结构体,其中 struct Time 记录的是日程安排的开始时间、结束时间;而 struct Break 记录的是可以打盹的开始时间和结束时间,还有可以打盹的时间。按照时间的格式,所以选择用字符数组来保存时间,而日程安排事项自然也用字符数组,注意包含空格,故选用gets() 输入。在计算打盹时间时是按分钟计算的。由 阅读全文
posted @ 2012-03-14 08:55 笑巧 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 题意:从某个数开始,先将它每一位数的顺序颠倒过来,然后把这个数和原数相加。如果和不是一个回文,就重复这一操作,直到它变成一个回文数。输出得到的回文数所需的最少加法次数以及得到的回文数。(回文数不超过4 294 967 295)解题思路:由于回文数超过整型范围,所以用数组 a[] 存储这个数,而用数组 b[] 存储字符数组 a的逆序串。然后进行大数相加(注意进位),把结果保存在数组 a 中,不断进行更新,直到 a中存放的是一个回文数。#include<iostream>#include<cstring>#include<cstdio>usingnamespac 阅读全文
posted @ 2012-03-10 21:09 笑巧 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 题意:长L米,有N个弯,弯 i 位置为 T_i ,速度不能超过 S_i 米。前进一米速度可以增加 1,保持不变或减少 1m/s 。求此路程中最大的速度。解题思路:定义 a[], b[], c[] 三个数组,数组a[]从开始记录在每个位置中速度的最大值,数组 b[] 从结尾倒着记录速度的最大值。而数组 c[] 记录同一位置i 的 a[i] 和 b[i] 的最小值。然后求数组 c[] 中的最大值即为所求。View Code 1#include<iostream>2#include<cstdio>3#include<cstring>4usingnamespaces 阅读全文
posted @ 2012-03-10 09:01 笑巧 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 解题思路:刚开始以为是找最长的回文子串,陷入了误区。这道题类似回文子串,但不同的是回文子串的意思是正着看和倒着看是相同的。而本题的关键在于"the reversal of the substring is also a substring of input ”,就是它的逆串也存在在这个字符串中。比如ABCDBA的最长回文子串是A,但按本题结果应该是AB。注意:应该输出第一个出现这种满足题意的子串,而且必须是连续的。(求最长公共子序列不要求连续,注意区分。)View Code 1#include<iostream>2#include<cstdio>3#inclu 阅读全文
posted @ 2012-03-09 10:08 笑巧 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 解题思路:这是道表达式求值问题,只需考虑加法(add)、求最大值(max)以及最小值(min),可以用递归简单实现。注意括号和逗号的处理。View Code 1#include<iostream>2#include<cstdio>3usingnamespacestd;45charstr[1000];6intstart;78intmin(inta,intb)9{10if(a<b)returna;11elsereturnb;12}13intmax(inta,intb)14{15if(a<b)returnb;16elsereturna;17}18intSolve( 阅读全文
posted @ 2012-03-09 09:16 笑巧 阅读(277) 评论(0) 推荐(0) 编辑