博文
ct5_2: 跳棋★★(2008-03-09 19:33:00)
摘要:ct5_2: 跳棋★★题目描述:水平方向上有n个格子,格子上写着1到n的数字中的一个,游戏规则是:走到某一格,上面的数字假如是s,则可以选择跳到第s个格子或者前进一格,问你最少要走多少步才能到达最后一格并且返回起点。如:3 5 3 2 6 5 ,你去的时候可以一步一步到终点(5步),也可以一开始就跳到第三格,再一步一步到终点(4步),或者先前进一步再跳到第5格再一步一步地走(3步),最少是3步到达。然后要再返回的时候,最少步数的走法是,左移两步再跳到第二格再左移一步(4步),共7步。注意,跳的时候只能向着你的目标方向跳,不能反向。
输入:多组测试数据,第一行是一个整数n(1<=n<=1e5),第二行是n个整数,表示对应的格子上写着的数。当n输入为0的时候结束。
输出:输出最少所需要的到达终点再返回原点的总步数
样例输入:63 5 3 2 6 50
样例输出:7
难度:Easy
解题报告: ct5_2 跳棋
题目要求: 从1开始出发走到第n个格子,走到某一格,上面的数字假如是s,则可以选择跳到第s个格子 或者前进一格, 但是有个条件,只能先前跳,如果第s个格子里的数字小于s,那么就不能跳了 到达第n个格子后,再向回走,规则和来的时候一样,也是只能向前走或者向前跳,假如走到第s 格如果第s格里的数字比s大,就不可以跳了,只能朝这第1个格子的方向走或者跳.题目求这样 一来一回最少用多少步.
基本想法: 其实回去的时候所走的步数和来的时候的步数没什么关系,所以可以分开考虑,而且来和回的过程 实质是一样的,我们可以用相同的方法分别求出来和回的最少步数,然后相加就得到了答案.
核心问题: 我们只考虑从1走到n的最少步数,如果这个可以求出来,那么回来的步数用同样的方法也可以求出来......
ct5_3: 恶魔数字7★(2008-02-29 21:43:00)
摘要:ct5_3: 恶魔数字7★题目描述:7是一个恶魔数字,如果一个数是7的倍数,或者它的数位上含有数字7,那么这个数也是恶魔数字输入:多组测试数据,每组只有一行,一行只有一个整数n(1<=n<=1e(1e5)),最后输入一个0来表示结束输出:判断这个数是不是恶魔数字,是的话输出yes,否则输出no样例输入:7171470940样例输出:yesyesyesyesno难度:very easy
我的代码:
#include<iostream>using namespace std;
int main(void){ long dn; do { int flag=0,k=10,temp=0; cin>>dn; if( dn>=1 && dn<=100000 ) { if(dn%7==0) flag=1; else { while(dn>=10) { temp=dn%k; dn/=k; if(temp==7) { flag=1; break; } } } if(flag==1) cout<<"yes"<<endl; else cout<&......
ct10_2:小小的黑客 ★(2008-02-26 17:11:00)
摘要:郁闷~~~~又错~~~哪点出问题了嘛~
帮帮小弟吧~~
题目描述:有一个小小的黑客,他叫小白。有一天,他为了破解一个软件,找出里面的漏洞,不停地去分析反汇编代码。终于,他发现了破解的方法:在各个字符串资源里分别找出距离最近的一对相同字符,这几对字符的距离组合起来再对用户名进行hash变换就是注册码了!于是小白又一次偷笑。输入:多组测试数据,一组一行,每行为一个长度不超过1e6的字符串以EOF标志结束输出:找出距离最近的一对相同字符,直接输出距离值。如果不存在相同字符,则输出-1样例输入:123123123456789abcde12a45样例输出:3-17其它:注意效率难度:Very Easy
我的代码:
#include<iostream>#include<cstring>using namespace std; char a[1000000]; //为什么这个放到主函数里面就出问题呢?
char b[1000000]; //会有Memory Limit Exceedint main(){
while(cin>>a) { int i,j,alen=0,tlen=0; long minlen=1000001; alen=strlen(a); for(i=0;i<alen;i++) b[i]=a[i]; for(i=0;i<alen;i++) { for(j=i+1;j<alen;j++) { if(a[i]==b[j]) { tlen=j-i; if(tlen<minlen) { if(tlen<0) tlen=-tlen; minlen=tlen; &......
习题 43:猜数字★(2008-02-20 15:21:00)
摘要:题目描述:猜数字游戏大家玩过没?经典的规则是给出一个四位数,然后你去猜。如那个数是1357,你猜1234的话,就给出1A1B,这是什么意思呢?nA表示有n个数的位置猜对了,nB表示有n个数猜对了,但位置不对,如果你再猜2351当然给出2A1B了,如果你猜2468,那就是0A0B了。现在,把四位数扩展到n位,由数字扩展到字符,输入两个字符串,你判断出猜对位置的和猜对了但位置不对的。如abcdefg和aceg123,结果就是1A3B
输入:多组测试数据,每组占一行,每行有两个字符串,串长小于10000,用空格分隔开
输出:输出这两个字符串比较的结果
样例输入:1357 1234abcdefg aceg123AaAa AAaa121212 2121212211Qq qqGame
样例输出:1A1B1A3B2A2B0A6B1A0B
我的代码:
[code]
#include<iostream>#include<cstring>using namespace std;
const int Max=10000;
int main(){ char A[Max],B[Max],F[Max]; int i=0,j=0,Alen=0,Blen=0,len=0; int Ncount=0,Pcount=0; cin>>A>>B; Alen=strlen(A); Blen=strlen(B); len=Alen>Blen?Alen:Blen; for(i=0;i<len;i++) //找出相同的 { if(A[i]==B[i]) Ncount++; } for(i=0;i<Alen;i++) //flag F[i]=0; for(j=0;j<Blen;j++) //找出B中与A相同字符的个数,
for(i=0;i<Alen;i++) { if( (B[j]==A[i......
