首页 > 代码库 > NYOJ 34 韩信点兵

NYOJ 34 韩信点兵

 

                                                                韩信点兵

                                                                    时间限制:3000 ms  |  内存限制:65535 KB
                                                                                                      难度:1
 
描述
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。
 
输入
输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。例如,输入:2 4 5
输出
输出总人数的最小值(或报告无解,即输出No answer)。实例,输出:89
样例输入
2 1 6
样例输出
41
解题思路:如果这个串的长度是奇数,那么这个串就不可能是经过镜面对称得来的,所以串的最小长度就是它本身,如果串是偶数,还要讨论一种情况,如AB,第一个与第二个不一样,那么二就是最小串,若长度为2,但是串为AA,则最小串长为1.
可以分为:
先看这个串长是否为2,如果是,看第一个字符与第二个是否相等,如果不相等,输出2,接下来判断串长是否为奇数,如果是奇数,输出字符串的长度就是答案,其他情况,将串对半劈开进行对应位置的比较,d=1,劈成两半的串有不对称的地方,出现这种情况,就输出当前串长的二倍。
 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     char a[100];
 6     int i,len,temp,num;
 7     scanf("%d",&num);//num组测试数据
 8     getchar();//用于接收空格
 9     while(num--)
10     {
11         gets(a);
12         len=strlen(a);
13         while(1)
14         {
15             if(len==2&&a[0]!=a[1])//串长为2,且两个字符不一样,输出串长为2
16             {
17                 printf("2\n");
18                 break;
19             }
20             else if(len%2!=0)//如果串长为奇数,串不可能是镜面对称得来的,直接输出长度
21             {
22                 printf("%d\n",len);
23                 break;
24             }
25             else
26             {
27                 int d=0;
28                 len=len/2;//将串对半劈开,进行比较
29                 for(i=0;i<len;i++)
30                     if(a[i]!=a[2*len-i-1])
31                     {
32                         d=1;//代表中间有不对称的地方
33                         break;
34                     }
35                 if(d==1)
36                 {
37                     printf("%d\n",2*len);//d为1代表串不是镜面对称的,结束循环,输出答案
38                     break;
39                 }
40             }
41         }
42     }
43     return 0;
44 }

 

技术分享

NYOJ 34 韩信点兵