2017蓝桥杯模拟赛高职组



标题: 1的个数




请统计出下面的数据块中有多少个1?


10111000100110010111110111000101100100011001100110
00100101100010100101101000101011101000011010010001
10010001101100010001001111101000011001011011010110
01011101011110101110101111010100010001111100000000
11101110101100101100100101010011101101111110100101
10010111000000101111100010011100100101110100101000
10010001000110101011000011111001110110101010111101
01101000100000111010001110001101111101000001000011
01001010001011100100110010111111100110111100010000
10000001011000000011000110110101010111100011000000
11010100101101110000000110110011111000100010011110
10101101101001011101100011011111111101100100010000
00101000100000000101000100101011001111000100111011
10100111011101100010101000111111001010000100111111
01111010100001100010011011100010111001111001010001
01100011100111000010100000011101100001001000010001
00000001111001000111010010001101101110110110100000
00000001110111101010011111110000110101100001111101
11100100111110100101100110010111100011111011111000
10010101101111011011011111101000111011000010111001


当然,我们不反对你一行一行地人工数出来,但这很容易出错啊。这么机械的事情为什么不交给计算机帮你呢?


可以把这些数据做成一个常量串,然后逐一枚举每个字符,遇见是1的就计数吧!


祝你好运!


注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字

497

#include
#include
using namespace std;
int main()
{
char a[]="1011100010011001011111011100010110010001100110011000100101100010100101101000101011101000011010010001100100011011000100010011111010000110010110110101100101110101111010111010111101010001000111110000000011101110101100101100100101010011101101111110100101100101110000001011111000100111001001011101001010001001000100011010101100001111100111011010101011110101101000100000111010001110001101111101000001000011010010100010111001001100101111111001101111000100001000000101100000001100011011010101011110001100000011010100101101110000000110110011111000100010011110101011011010010111011000110111111111011001000100000010100010000000010100010010101100111100010011101110100111011101100010101000111111001010000100111111011110101000011000100110111000101110011110010100010110001110011100001010000001110110000100100001000100000001111001000111010010001101101110110110100000000000011101111010100111111100001101011000011111011110010011111010010110011001011110001111101111100010010101101111011011011111101000111011000010111001";
int i,cnt=0;
for (i=0; a[i]; i++)
{
if (a[i] == '1')
cnt++;
}
cout<return 0;
 } 








    地产大亨Q先生临终的遗愿是:拿出100万元给X社区的居民抽奖,以稍慰藉心中愧疚。
麻烦的是,他有个很奇怪的要求:


1. 100万元必须被正好分成若干份(不能剩余)。每份必须是7的若干次方元。
   比如:1元, 7元,49元,343元,...


2. 相同金额的份数不能超过5份。


3. 在满足上述要求的情况下,分成的份数越多越好!


请你帮忙计算一下,最多可以分为多少份?




注意:只需要填写一个整数,就是分成的份数,不要填写任何多余的内容。比如说明文字。


-----------------------------


剧透中.......


笨笨有话说:
    7的次方能有多少啊?不超过100万的一共就那么几个,每个的取值从0到5,
组合起来也没有多少啊,看看哪个组合刚好凑成100万不就行了。
    如果嫌找出最多的那个组合费事,把所有凑成100万的输出不就行了?我就不信,
能凑成100万的情况会有那么多吗?应该屈指可数吧!    


歪歪有话说:
    如果要求是10的次幂的话,1,10,100,1000,.... 会怎么样?很容易算哦。
那么,10是个特殊的数字吗?难道不是因为我们人类有10个手指吗?
如果我们的手指是7根.......7进制你听说过吗?


算出来是16份,结果如下图,不知道是不是最大的份数,如果不是请在最下方评论正确答案,感谢!!

#include
#include
using namespace std;
int a[8]={823543,117649,16807,2401,343,49,7,1};
int v[8]={0},MAX=0,flag=0;
void dfs(int s)
{
	int i,sum=0,ss=0;
	if (flag)
	 return;
	if (s>1000000)
	{
		return ;
	}
	if (s == 1000000)
	{
		for (i=0; i<8; i++)
		{
			sum+=v[i];
		}
		if(MAX < sum)
		{
			for (i=0; i<8; i++)
			{
				cout<



2017蓝桥杯模拟赛高职组_第1张图片



题目:猜算式


你一定还记得小学学习过的乘法计算过程,比如:


   273
x   15
------
  1365
  273
------
  4095
  
请你观察如下的乘法算式


    ***
x   ***
--------
    ***
   ***
  ***
--------
  *****
  
星号代表某位数字,注意这些星号中,
0~9中的每个数字都恰好用了2次。
(如出现因字体而产生的对齐问题,请参看图p1.jpg)


请写出这个式子最终计算的结果,就是那个5位数是多少?


注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。


------------------------------------------------------------


剧透中......


笨笨有话说:
    把所有可能的3位数乘以3位数搜索一遍的话....
关键是,这20个数字中0~9都用了两次,需要统计每个数字出现的次数...
看起来有点麻烦啊!


歪歪有话说:
    我敢打赌!如果有某个数字出现次数不足2次,就一定有某个数字出现多于2次!
这样,在累积出现次数的时候,只要看到某数已经出现3次了,就果断否定之!

#include
#include
#include
using namespace std;
int i,j;
int check()
{
	int a,b,c,k,s;
	int v[20]={0};
	v[i%10]++;
	v[i/10%10]++;
	v[i/100]++;
	v[j%10]++;
	v[j/10%10]++;
	v[j/100]++;
	for (k=0; k<20; k++)
	{
		if (v[k] > 2)
		 return 0;
	}
	a = i*(j%10);
	b = i*(j/10%10);
	c = i*(j/100);
	if (a/1000>0||b/1000>0||c/1000>0)
	 return 0;
	v[a%10]++;
	v[a/10%10]++;
	v[a/100]++;
	v[b%10]++;
	v[b/10%10]++;
	v[b/100]++;
	v[c%10]++;
	v[c/10%10]++;
	v[c/100]++;
	s = i*j;
	v[s%10]++;
	v[s/10%10]++;
	v[s/100%10]++;
	v[s/1000%10]++;
	v[s/10000%10]++;
	for (k=0; k<20; k++)
	{
		if (v[k] > 2)
		 return 0;
	}
	return 1;
	
}
int main()
{
	for (i=100; i<=999; i++)
	{
	  for (j=100; j<=999; j++)
	  {
	  	 if (check())
	  	  {
	  	  	cout<




标题:数字段计数


在一个给定的字符串中,既包含数字也包含字母。
我们不关心具体的数字、字母都是什么。
我们只是想知道,被字母隔开的数字区域一共有多少个?


换句话说,把连续的数字看成一个数字段(单个的数字也算一段),那么这样的“段”有多少呢?


比如:"YYY5532XX6X78" 就包含3个数字段。
而,"45TTT7799M" 包含两个数字段。  


下面的程序解决了这个问题。
其思路是:每发现一个由字母到数字的“跳变”就计数。
请仔细阅读源码,提交划线的位置缺少的代码。


注意:
只提交划线部分缺少的代码,不要包含已经存在的代码或符号。
也不要画蛇添足地写出任何注释或说明性文字。


注意选择你所使用的语言。


java代码:
String s = "7AAA1234BBB5555KIKI8888FF1319621d....kkk9kk";
boolean old_tag = false;  // 表示开始不是数字
boolean tag = false; 
int n = 0; // 数字组计数
for(int i=0; ichar c = s.charAt(i);
tag = c>='0' && c<='9';  // 是否为数字
if(___________________) n++;  //填空位置
old_tag = tag;
}

System.out.println(n);



c/c++代码:
char s[] = "7AAA1234BBB5555KIKI8888FF1319621d....kkk9kk";
int old_tag = 0;  // 表示开始不是数字
int tag = 0; 
int n = 0; // 数字组计数
int i;
for(i=0; s[i]; i++){
char c = s[i];
tag = c>='0' && c<='9';  // 是否为数字
if(____________________) n++;   //填空位置
old_tag = tag;
}

printf("%d\n", n);


//这样写不对,对于数字在末尾的就无法计数了,感谢评论区5楼的指正,谢谢
!tag&&old_tag


//应该这样,当前的是数字且上一个不是数字

tag && !old_tag



标题:报数游戏


有 n (1 选定一个小朋友为1号,从他(她)开始顺时针编号:1,2,3,4,...


游戏开始! 从1号小朋友起,顺时针报数,从1报起。
即:1号小朋友报1,2号小朋友报2,3号小朋友报3, ....


游戏规定,报到数字 m(1 在他(她)的顺时针方向的下一个小朋友(如果有的话)开始重新从1报数...
游戏这样一直进行下去,直到圈中只剩下一个小朋友。


求最后剩下的小朋友的编号。


输入:两个整数,n 和 m, 用空格分开。含义如上。


输出:一个整数,表示最后剩下的小朋友的编号。


比如:
输入:
15 3
程序应该输出:
5


再比如:
输入:
7 4
程序应该输出:
2


资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
java选手注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
java选手注意:主类的名字必须是:Main,否则按无效代码处理。


c/c++选手注意: main函数需要返回0
c/c++选手注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
c/c++选手注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。


提交程序时,注意选择所期望的语言类型和编译器类型。


--------------------------------------


ps. 
剧透中.....


笨笨有话说:
    如果用一个数组来表示小朋友,用一个变量来记着当前的小朋友....
麻烦的是如何表示小朋友已经“离席”.....要不把他(她)的位置填为特殊值。
当前位置需要不断移动,移动到数组边沿需要折回来,好麻烦啊...


歪歪有话说:
    自己做个循环小链表挺好的,正好和实际情况一模一样。怎么判断只剩一个孩子呢?
自己的下一个还是自己!


#include  
#include  
using namespace std;  
int main()  
{  
    int n, m,i,s=0;  
scanf("%d %d",&n,&m); 
if (n==0 && m==0)  
break;  
s = 0;  
for(i=2;i<=n;i++)  
{  
s=(s+m)%i;  
}  
cout<     return 0;  
}  




标题:加密解密


    Playfair密码由英国人发明,它使用方便而且可以让频度分析法失效,直到一战中才被破译。
    其一变种方法如下:首先选择一个密钥单词(称为pair)(剔除重复字母,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下:
1.首先按行填入密钥串,重复的字母忽略之。
2.紧接其后,按字母序按行填入不在密钥串中的字母。
3.由于方阵中只有25个位置,最后剩下的那个字母则不需填入。
如果密钥为lanqiao,则该方阵如下:  
l a n q i
o b c d e
f g h j k
m p r s t
u v w x y


在加密一对字母时,如da,在方阵中找到以这两个字母为顶点的矩形。
这对字母的加密字母为该矩形的另一对顶点,如本例中为bq。


请设计程序,使用上述方法对输入串进行加密,并输出加密后的串。


另有细则如下:
1、一对一对取字母,如果最后只剩下一个字母,则不变换,直接放入加密串中;
2、如果一对字母中的两个字母相同,则不变换,直接放入加密串中;
3、如果一对字母中有一个字母不在矩阵中,则不变换,直接放入加密串中;、


4、如果字母对出现在方阵中的同一行或同一列,如fk或ky,则只需简单对调这两个字母,即变换为kf或yk;


5、如果在正方形中能够找到以字母对为顶点的矩形,假如字母对为da,则该矩形的另一对顶点字母中,与d同行的字母应在前面,在上例中应是bq;同样若待变换的字母对为pj,则变换后的字母对应为sg;
6、本程序中输入串均为小写字母,并不含标点、空格或其它字符。


解密方法与加密相同,即对加密后的字符串再加密,将得到原始串。


输入格式如下:
输入为两行字符串,
第一行为密钥单词(长度小于等于25),
第二行为待加密字符串(长度小于等于50),
两行字符串末尾都有一个回车换行符,
并且,两行字符串均为小写字母,不含其它字符。


输出为一行,表示加密后的字符串。


例如:
输入:
lanqiao
dasai


程序应该输出:
bqpqi




再例如:
输入:
dasai
lanqiao


程序应该输出:
ksltaio




资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
java选手注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
java选手注意:主类的名字必须是:Main,否则按无效代码处理。


c/c++选手注意: main函数需要返回0
c/c++选手注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
c/c++选手注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。


提交程序时,注意选择所期望的语言类型和编译器类型。

#include  
#include
#include  
using namespace std; 
char my[100],pw[100],str[25],s[5][5],ch,passwd[100];
int k=0,v[30]={0}; 
int f1(char x,char y)
{
	int i,j,a,b,c,d;
	for (i=0; i<5; i++)
	for (j=0; j<5; j++)
	{
		if (x == s[i][j])
		{
			a = i;
			b = j;
		}
		if (y == s[i][j])
		{
			c=i;
			d=j;
		}
	 } 
	 if (a==c || b==d)
	 {
	 	return 1;
	 }
	 return 0;
}
int f(char x, char y) //两个有一个不在 
{
	int i,j,flag=0;
	for (i=0; i<5; i++)
	for (j=0; j<5; j++)
	{
		if (x==s[i][j] || y == s[i][j])
		{
			flag++;
		}
	}
	if (flag == 1)
	{
		return 1;
	}
	return 0;
 } 
 void f2(char x,char y)//找对角 
 {
 	int i,j,a,b,c,d;
 	for (i=0; i<5; i++)
 	{
 		for (j=0; j<5; j++)
 		{
 			if (s[i][j] == x)
 			{
 				a = i;
 				b = j;
			 }
			 if (s[i][j] == y)
			 {
			 	c = i;
			 	d = j;
			 }
		 }
	 }
	passwd[k++] = s[a][d];
	passwd[k++] = s[c][b];
 }
int main()  
{ 
 	int i,j;
 	scanf("%s%s",my,pw);
 	for (i=0; my[i]; i++)
 	{
 		v[my[i]-'a']++;
 		if (v[my[i]-'a'] > 1)
 		{
 			continue;
		}
	    str[k++] = my[i];
	 }
	 ch = k/5+'a'; //ch为接着的起始字母
	 for (i=k; i<25;)
	 {
	 	v[ch-'a']++;
	 	if (v[ch-'a'] > 1)
	 	{
	 		ch++;
	 		continue;
		}
	 	str[i] = ch++;
	 	i++;
	  }
	  k=0;
	for (i=0; i<5 ;i++)//放入5*5数组中 
	for (j=0; j<5; j++)
	{
		s[i][j] = str[k++];
	}
	k=0;
	for (i=0; pw[i];)
	{
		if (pw[i+1]!='\0')
		{
			if (pw[i] == pw[i+1] || f(pw[i],pw[i+1])) //相等 ,或者有一个不再矩阵中 
			{
				passwd[k++] = pw[i];
				passwd[k++] = pw[i+1];
				i+=2;
				continue;
			}
			if (f1(pw[i],pw[i+1])) //同行或同列,调换两者 
			{
				passwd[k++] = pw[i+1];
				passwd[k++] = pw[i];
				i+=2;
				continue;
			 } 
			f2(pw[i],pw[i+1]); //找对角的
			i+=2;
		}
		else if (pw[i+1] == '\0')
		{
			passwd[k++] = pw[i];
			break;
		}
	}
	passwd[k] = '\0';
	puts(passwd);
    return 0;  
}  



题目:滑动解锁


滑动解锁是智能手机一项常用的功能。你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点。这些划过的点所组成的有向折线,如果与预设的折线在图案、方向上都一致,那么手机将解锁。


所谓两个点“相邻”:当且仅当以这两个点为端点的线段上不存在尚未经过的点。


此外,许多手机都约定:这条折线还需要至少经过4个点。


为了描述方便,我们给这9个点从上到下、从左到右依次编号1-9。即如下排列:


1 2 3
4 5 6
7 8 9


那么1->2->3是非法的,因为长度不足。
1->3->2->4也是非法的,因为1->3穿过了尚未经过的点2。
2->4->1->3->6是合法的,因为1->3时点2已经被划过了。


某大神已经算出:一共有389112种不同的解锁方案。没有任何线索时,要想暴力解锁确实很难。
不过小Hi很好奇,他希望知道,当已经瞥视到一部分折线的情况下,有多少种不同的方案。
遗憾的是,小Hi看到的部分折线既不一定是连续的,也不知道方向。


例如看到1-2-3和4-5-6,
那么1->2->3->4->5->6,1->2->3->6->5->4, 3->2->1->6->5->4->8->9等都是可能的方案。




你的任务是编写程序,根据已经瞥到的零碎线段,求可能解锁方案的数目。


输入:
每个测试数据第一行是一个整数N(0 <= N <= 8),代表小Hi看到的折线段数目。
以下N行每行包含两个整数 X 和 Y (1 <= X, Y <= 9),代表小Hi看到点X和点Y是直接相连的。


输出:
对于每组数据输出合法的解锁方案数目。




例如:
输入:
8
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9


程序应该输出:
2


再例如:
输入:
4
2 4
2 5
8 5
8 6


程序应该输出:
258








资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
java选手注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
java选手注意:主类的名字必须是:Main,否则按无效代码处理。


c/c++选手注意: main函数需要返回0
c/c++选手注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
c/c++选手注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。


提交程序时,注意选择所期望的语言类型和编译器类型。


--------------------------------


ps.
剧透中....


笨笨有话说:
    我感觉9层循环就可以,每层循环都设定下一步连到哪个数字。再把不合要求的滤掉就是了。
....等等....长度大于等于4的都是合法方案, 我想从第5层循环开始,每层都要增加一个选项,表示:图案终止了!  还需要有个设施,记录当前已经走过的数字......
.....还有....回溯,这个千万不能忘记哦,回到上层循环就要把本层的选择从路径历史中清除!




歪歪有话说:
    这么多层,还是递归吧!把历史路径、剩余目标步数当参数传递好像挺不错的。
#include
using namespace std;
int no[10][10]={0},v[10]={0},cnt=0,a[10]={0};
int n,f[9][2]={0};
int check(int x)
{
	int i,j; 
	for (i=1; i<=n; i++) //检测 
	{
		for (j=2; j<=x; j++)
		{
			if ((a[j]==f[i][0] && a[j-1]==f[i][1]) || (a[j]==f[i][1]&&a[j-1]==f[i][0]))
			 break;
		}
		if (j>x)
		 return 0;
    }
	return 1;
}
void dfs(int x)
{
	int i;
	if (x>4)
	{
		if (check(x-1))
		{
			cnt++;
		}
		
	}
	for (i=1; i<=9; i++)
	{
		if (!v[i])
		{
			if (x>1)
			{
				if (no[i][a[x-1]]  //如果当前选的点(i)和上一个选的点(a[x-1])是跨点的,比如1和9跨5,1和3跨2 
				&& !v[no[i][a[x-1]]]) //那么两个点中间的点是必须被走过的,假如没走过就是非法的 
				continue;
			}
			a[x] = i;
			v[i] = 1;
			dfs(x+1);
			v[i] = 0;
		}
	}
}
int main()
{
	int i,j;
	no[1][3] = no[3][1] = 2;
	no[1][9] = no[9][1] = 5;
	no[1][7] = no[7][1] = 4;
	no[2][8] = no[8][2] = 5;
	no[3][7] = no[7][3] = 5;
	no[4][6] = no[6][4] = 5;
	no[7][9] = no[9][7] = 8;
	no[3][9] = no[9][3] = 6;
	cin>>n;
	if (n == 0)
	{
		cout<<389112;
		return 0;
	}
	for (i=1; i<=n; i++)
	{
		cin>>f[i][0]>>f[i][1];
	}
	dfs(1);
	cout<


你可能感兴趣的:(2017蓝桥杯模拟赛高职组)