03 2012 档案

摘要:解题思路:题意很明确,就是让求满足条件: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 笑巧 阅读(174) 评论(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 笑巧 阅读(200) 评论(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 笑巧 阅读(489) 评论(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 笑巧 阅读(465) 评论(0) 推荐(0)
摘要:解题思路:刚开始读不懂题意,不知道到底让求什么,看着测试数据也很奇怪。根据题意,目的要求是“多退少补”,那么可以把学生分成两组,一组是垫付的费用大于平均费用的,一组是小于等于平均费用的,垫付多的学生应该退还钱款,垫付少的应该收取费用。而所求的是需要最少的那部分。即让求每个学生平摊支出所需的最小总“交易”金额。首先计算“平均费用”,由于要求支出差距在1分钱以内,故可以考虑在计算时取小数点后两位,对于第三位以后的数采用四舍五入的方法。可以截取浮点数中的部分小数位:sprintf( tmp, "%.2lf", ave); sscanf( tmp, "%lf", 阅读全文
posted @ 2012-03-14 09:22 笑巧 阅读(332) 评论(0) 推荐(0)
摘要:解题思路:题意很明确,就是依据日程安排找出最长的可能打盹的时间。其实就是把所有空闲的时间排序(先要对日程安排时间从小到大排序,然后计算出可能的打盹时间),然后找到最长的即为所求。需要注意的是:时间从 10:00 开始,到 18:00 结束,在计算过程中一定要把边界考虑上。我定义了两个结构体,其中 struct Time 记录的是日程安排的开始时间、结束时间;而 struct Break 记录的是可以打盹的开始时间和结束时间,还有可以打盹的时间。按照时间的格式,所以选择用字符数组来保存时间,而日程安排事项自然也用字符数组,注意包含空格,故选用gets() 输入。在计算打盹时间时是按分钟计算的。由 阅读全文
posted @ 2012-03-14 08:55 笑巧 阅读(258) 评论(0) 推荐(0)
摘要:题意:从某个数开始,先将它每一位数的顺序颠倒过来,然后把这个数和原数相加。如果和不是一个回文,就重复这一操作,直到它变成一个回文数。输出得到的回文数所需的最少加法次数以及得到的回文数。(回文数不超过4 294 967 295)解题思路:由于回文数超过整型范围,所以用数组 a[] 存储这个数,而用数组 b[] 存储字符数组 a的逆序串。然后进行大数相加(注意进位),把结果保存在数组 a 中,不断进行更新,直到 a中存放的是一个回文数。#include<iostream>#include<cstring>#include<cstdio>usingnamespac 阅读全文
posted @ 2012-03-10 21:09 笑巧 阅读(211) 评论(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 笑巧 阅读(191) 评论(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 笑巧 阅读(205) 评论(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 笑巧 阅读(286) 评论(0) 推荐(0)
摘要:题意:其实就是字母序号与数字序号的转换,有点类似字典序。解题思路:不论输入的是字符串还是数字都用一个字符数组来存储,只需要判断字符串的第一个字符是数字还是字母,然后分情况解决。众所周知,英文字母有26个,这就是重点所在。注意:当字符串很长时,所求的数字序号会超过整型范围,所以定义为long long型,或 __int 64.(但NYOJ不识别__int 64)。View Code 1#include<iostream>2#include<cstdio>3#include<cstring>4#include<stack>//栈操作5usingnam 阅读全文
posted @ 2012-03-09 09:08 笑巧 阅读(216) 评论(0) 推荐(0)
摘要:题意:就像查找一本字典,根据输入的条目和要查询的单词,给出查询结果(每个单词长度不超过10),所查单词数不超过100 000.解题思路:由于数据量很大,即使我用了scanf 和 printf 还是会超时。所以如果依次遍历要查找的单词速度很慢。后来发现用二分查找就很容易,但要二分必须对单词进行排序,故用到了标准库函数qsort进行快速排序。另外,对于数据输入需要特别注意,以前遇到过类似的情况,所以就学会了应用peek() 函数。函数peek()用于输入流中,并返回在流中的下一个字符或如果是处于被入的文件的结尾处返回EOF,peek()不会把字符从流中移除。所以必须用getchar() 来消除换行 阅读全文
posted @ 2012-03-07 10:05 笑巧 阅读(874) 评论(0) 推荐(0)
摘要:解题思路:这是一个模拟题,其中命令F刚开始理解错了,这点是本题得难点所在。F命令为:把区域R填充为颜色(C)。R定义如下:若像素(X,Y)属于R,则所有与(X,Y)有公共边且颜色相同的像素也属于R。其实这跟我们以前做的搜索题能联系在一块儿,可以用递归实现。注意:图像的边界问题也要考虑。View Code 1#include<iostream>2usingnamespacestd;3charmap[255][255];4intn,m;5voidfill(charmap[255][255],intx,inty,intcold,intcnew)//命令F(搜索)6{7if(cold==c 阅读全文
posted @ 2012-03-02 09:13 笑巧 阅读(252) 评论(0) 推荐(0)
摘要:题意:其实就是两个大数相加的和。解题思路:由于输入方式不同,而位数N<=1000,000;所以很容易TLE,刚开始我定义了两个整型数组存放这两个大数,可是超时,后来查阅资料,发现开辟一个字符数组,在输入的过程中处理数据,就可以AC了。View Code 1#include<stdio.h>2intmain()3{4chara[1000002]={'0'};5intn,i;6intx,y;7scanf("%d",&n);8for(i=0;i<n;i++)9{10scanf("%d%d",&x,& 阅读全文
posted @ 2012-03-01 11:05 笑巧 阅读(216) 评论(0) 推荐(0)
摘要:题意:让电脑屏幕像液晶屏一样显示数字。解题思路:假设 s=1,每个数字都是‘ 日 ’上的笔画,分为三 ‘—’四‘|’,三行即:第一行,中间行,最底行;四列即:左上列,右上列,左下列,右下列。故用字符数组定义0-9这十个数字应显示的笔画,让后根据 s 的值来判定循环几次输出。注意:那些数字中的空白之处要填上空格,并且两个数字之间必须有一个空列。在每个整数后面输出一个空行。View Code 1#include<iostream>2#include<cstring>3usingnamespacestd;4charn1[]="--------";//第一行 阅读全文
posted @ 2012-03-01 10:44 笑巧 阅读(265) 评论(0) 推荐(0)