2018年12月1日 蓝桥杯校内筛选赛

1、

【问题描述】

某涉密单位下发了某种票据,并要在年终全部收回。
    每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
    因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
    你的任务是通过编程,找出断号的ID和重号的ID。
    假设断号不可能发生在最大和最小号。
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)
每个整数代表一个ID号。
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID
样例输入
2
5 6 8 11 9
10 12 9
样例输出:
7 9
样例输入:
6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
样例输出:
105 120
#include<iostream>
#include<algorithm>
int main()
{
using namespace std;
int a[120]{},n,cuo=0,chong=0;
cin>>n;
int i=0;
for(int c=1;c<=n;c++)
{
while(cin>>a[i]&&a[i]!=’\n’)
{
i++;
}
}
sort(a,a+i);
for (int j=0;j<i-1;j++)
{
   if ((a[j]+1)!=a[j+1]&&a[j]!=a[j+1])
{
    cuo=a[j]+1;
}
if(a[j]==a[j+1])
   {
   chong=a[j];
   }
}
cout<<cuo<<” “<<chong<<endl;
return 0;
}

2、

问题描述
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:
1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 …..
我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)
输入为3个整数w m n,空格分开,都在1到10000范围内
要求输出一个整数,表示m n 两楼间最短移动距离。
样例输入:
6 8 2
样例输出:
4
样例输入:
4 7 20
样例输出:
5
#include<iostream>
#include<algorithm>
#include<cmath>
int main()
{
using namespace std;
int w,m,n,m1,n1,m2,n2,chang,kuan,zong;
cin>>w>>m>>n;
m1=m/w;
n1=n/w;
m2=m%w;
n2=n%w;
if(m1>m2)
chang=m1-m2;
if(m1<=m2)
chang=m2-m1;
if (m1%2!=n1%2)
{
if(m2>(w-n2))
kuan=m2-(w-n2)+1;
if(m2<=(w-n2))
kuan=(w-n2)-m2+1;
}
if (m1%2==n1%2)
{
if(m2>n2)
kuan=m2-n2;
if(m2<=n2)
kuan=n2-m2;
}
zong=chang+kuan;
cout<<zong<<endl;
return 0;
}

3、

【问题描述】

判断一个正整数是否是快乐数字?

如果一个数字能够通过有限次快乐变换成为1,则是快乐数字。

快乐变换是对一个数字的每一位的平方数求和。

例如:

对于68

68 => 62+82= 100

100 => 12 + 02 + 02 = 1

因此68是快乐数字

输入

每一行输入一个整数,代表n;如果n为-1,表示输入结束。(n <= 100000000)

输出

针对每组数据,输出是否是快乐数字 true/false

 

样例输入

68
-1

样例输出

true

4、

描述

小Hi参加了一场大型马拉松运动会,他突然发现面前有一位参赛者背后的号码竟然和自己一样,也是666。仔细一看,原来那位参赛者把自己号码帖反(旋转180度)了,结果号码999看上去变成了号码666。

小Hi知道这次马拉松一共有N名参赛者,号码依次是1~N。你能找出所有可能因为贴反而产生歧义的号码吗?

一个号码K可能产生歧义当且仅当反转之后的号码是合法的数字K’,并且满足1 ≤ K’ ≤ N且K’ ≠ K。

例如:

3没有歧义,因为贴反之后不是合法的数字。

100没有歧义,因为001以0开头,不是合法号码。

101也没有歧义,因为贴反之后还是101本身。

假设N=10000000,则1025689有歧义,因为贴反之后变成6895201。如果N=2000000,则1025689没有歧义,因为6895201大于N。

输入

一个整数N。(1 ≤ N ≤ 100000)

输出

从小到大输出1~N之间所有有歧义的号码。每个号码一行。

样例输入
10
样例输出
6 9

5、

 

描述

给定一个N × N的方格矩阵,其中每个格子或者是’*’,表示该位置有一个地雷;或者是’.’,表示该位置没有地雷:

*..*
..*.
....
****

现在小Hi希望你对于每一个’.’,计算它周围8个方格中一共有多少颗地雷。并且用计算出的地雷数替换原来的’.’:

*22*
12*2
2443
****

输入

第一行包含一个整数N,代表矩阵的大小。 (1 ≤ N ≤ 100)

以下是一个N × N的矩阵,由字符’.’和’*’组成。

输出

一个N × N的矩阵,表示答案。

样例输入
4  
*..*  
..*.  
....
****
样例输出
*22*    
12*2  
2443
****



#include<iostream>
#include<stdio.h>
using namespace std;
int n;
char mines[101][101]{};
int main()
{
cin>>n;
int lei = 0;
for (int i = 0; i < n; i++)
{
scanf(“%s”, mines[i]);
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (mines[i][j] == ‘.’)
{
lei = 0;
if(i-1>=0&&j-1>=0&&mines[i-1][j-1] == ‘*’)
lei++;
if(i-1>=0&&mines[i-1][j] == ‘*’)
lei++;
if(i-1>=0&&j+1<=n-1&&mines[i-1][j+1] == ‘*’)
lei++;
if(j-1>=0&&mines[i][j-1] == ‘*’)
lei++;
if(j+1<=n-1&&mines[i][j+1] == ‘*’)
lei++;
if(i+1<=n-1&&j-1>=0&&mines[i+1][j-1] == ‘*’)
lei++;
if(i+1<=n-1&&mines[i+1][j] == ‘*’)
lei++;
if(i+1<=n-1&&j+1<=n-1&&mines[i+1][j+1] == ‘*’)
lei++;
cout<< lei;
}else
cout<<“*”;
}
cout<<endl;
}
return 0;
}

5、

描述

给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列。

一个序列a是序列c的子序列,当且仅当a可以由c中删除任意数量的数获得。

输入

第一行两个正整数n,m. 1 ≤ m ≤ n ≤ 105

接下来m行,第i行一个数表示b[i]

输出

输出n行,第i行一个数表示A[i]

保证答案一定存在

样例输入
5 3
1
4
2
样例输出
1
3
4
2
5

6、

描述

假设一个机器人在笛卡尔坐标系上。它从(X1, Y1)移动到了(X2, Y2),然后向右转90度,继续前进。

请你计算这个机器人继续前进过程中最先经过的整点是哪一个?

输入

四个整数X1, Y1, X2, Y2

-1000000 ≤ X1, Y1, X2, Y2 ≤ 1000000 保证(X1, Y1)和(X2, Y2)是不同的点。

输出

两个整数X和Y代表最先经过的整点坐标。

样例输入
0 0 1 2
样例输出
3 1

7、

描述

给定一个只包含小写字母’a’-‘z’的字符串 S ,你需要将 S 中的字符重新排序,使得任意两个相同的字符不连在一起。

如果有多个重排后字符串满足条件,输出字典序最小的一个。

如果不存在满足条件的字符串,输出INVALID。

输入

字符串S。(1 ≤ |S| ≤ 100000)

输出

输出字典序最小的答案或者INVALID。

样例输入
aaabc
样例输出
abaca

现场提交代码(轻喷)

1、

#include<iostream>

#include<algorithm>

int main()
{

using namespace std;
int a[120]{},n,cuo=0,chong=0;
cin>>n;
int i=0;
for(int c=1;c<=n;c++)
{
while(cin>>a[i]&&a[i]!='\n')
{
i++;
}
}
sort(a,a+i);
for (int j=0;j<i-1;j++)
{
   if ((a[j]+1)!=a[j+1]&&a[j]!=a[j+1])
{
    cuo=a[j]+1;
    cout<<cuo<<" ";
    break;
}
}
for (int j=0;j<i-1;j++)
{
if(a[j]==a[j+1])
    {
    chong=a[j];
    cout<<chong<<endl;
    break;
    }
}
return 0;
}