HHTC_2020蓝桥训练(一)
emmmm,蓝桥训练又双叒叕开始了,而且自己也已经好久没有敲代码了,
感觉以前学的C语言都忘记了,恶补一下,虽说还不知道蓝桥啥时候开始比赛,
虽说训练的题目可能都比较简单,就当练习基础知识了!!!(基础已经忘记得差不多了~~Orz)
唉,加油,奥里给!!!干就完了
DNA
题目描述
小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词--DNA.它有一个双螺旋的结构。这让一根筋的小强抓破头皮,“要是能画出来就好了” 小强喊道。现在就请你帮助他吧
输入
输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。a表示一个单位的DNA串的行数,a为奇数且 3<=a<=39。b表示重复度(1<=b<=20)。
输出
输出DNA的形状,每组输出间有一空行。
样例输入
2
3 1
5 4
样例输出
X X
X
X X
X X
X X
X
X X
X X
X X
X
X X
X X
X X
X
X X
X X
X X
X
X X
X X
AC代码,简单模拟一下就完事了~~:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
char a[40][40];
int main(){
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(i == j || (i+j) == n-1){
a[i][j] = 'X';
}else{
a[i][j] = ' ';
}
}
}
for(int i = 0; i < m; i++){
for(int j = 0; j < n-1; j++){
for(int k = 0; k < n; k++){
cout<<a[j][k];
}
cout<<endl;
}
}
cout<<a[n-1]<<endl<<endl;
}
return 0;
}
第几天
题目描述
这是一个很经典的题,给定一个日期,输出这个日期是该年的第几天。
输入
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成(见样例) ,另外,可以向你确保所有的输入数据是合法的。
输出
对于每组输入数据,输出一行,表示该日期是该年的第几天。
样例输入
1985/1/20
2006/3/12
样例输出
20
71
AC代码:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int y,m,d;
while(scanf("%d/%d/%d",&y,&m,&d) != EOF){
if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
month[2] = 29;
int day = 0;
for(int i = 0; i < m; i++)
day += month[i];
cout<<day+d<<endl;
}
return 0;
}
[蓝桥杯] [历届试题] 回文数字
题目描述
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。
输入
一个正整数 n (10< n< 100), 表示要求满足的数位和。
输出
若干行,每行包含一个满足要求的5位或6位整数。
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1
样例输入
44
样例输出
99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499
先判断和,在判断回文,判断回文可以使用字符串逆序,AC代码:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int jsum(int n){
int sum = 0;
while(n){
sum += n%10;
n /= 10;
}
return sum;
}
bool jpde(int n){
string s = "";
while(n){
s += char(n%10 + '0');
n /= 10;
}
string str(s.rbegin(),s.rend());
if(str == s)
return true;
return false;
}
int main(){
int n;
cin>>n;
bool flag = false;
for(int i = 10000; i < 1000000; i++){
if(jsum(i) == n && jpde(i)){
flag = true;
cout<<i<<endl;
}
}
if(!flag)
cout<<-1<<endl;
return 0;
}
[蓝桥杯] [基础练习VIP] 回形取数
题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
AC代码,注意判断一下情况,当只有一行时是不用往右走的,一列也同理,这里wrong了几次Orz:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n,m;
int a[205][205],b[100000];
cin>>n>>m;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin>>a[i][j];
int num = 0;
for(int i = 0; i < ( n + 1 ) / 2 && i < ( m + 1 ) / 2; i++){
for(int j = i; j < n - i; j++)
b[num++] = a[j][i];
for(int j = i + 1; j < m - i; j++)
b[num++] = a[n - i - 1][j];
if(m - i - 1 > i)
for(int j = n - i - 2; j >= i; j--)
b[num++] = a[j][m - i - 1];
if(n - i - 1 > i)
for(int j = m - i - 2; j >= i + 1; j--)
b[num++] = a[i][j];
}
for(int i = 0; i < num; i++){
cout<<b[i]<<" ";
}
return 0;
}
[蓝桥杯] [基础练习VIP] 字符串对比
题目描述
给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
1:两个字符串长度不等。比如 Beijing 和 Hebei
2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing
4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
输入
包括两行,每行都是一个字符串
输出
仅有一个数字,表明这两个字符串的关系编号
样例输入
BEIjing
beiJing
样例输出
3
AC代码,模拟即可:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
string a,b;
cin>>a;
cin>>b;
if(a.size() != b.size())
cout<<1<<endl;
else{
if(a == b)
cout<<2<<endl;
else{
transform(a.begin(), a.end(), a.begin(), ::tolower);
transform(b.begin(), b.end(), b.begin(), ::tolower);
if(a == b)
cout<<3<<endl;
else
cout<<4<<endl;
}
}
return 0;
}
[蓝桥杯] [算法提高VIP] 不同单词统计
题目描述
编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数。例如:对于句子“one little two little three little boys”,总共有5个不同的单词:one, little, two, three, boys。
说明:(1)由于句子当中包含有空格,所以应该用gets函数来输入这个句子;(2)输入的句子当中只包含英文字符和空格,单词之间用一个空格隔开;(3)不用考虑单词的大小写,假设输入的都是小写字符;(4)句子长度不超过100个字符。
输入
输入只有一行,即一个英文句子。
输出
输出只有一行,是一个整数,表示句子中不同单词的个数。
样例输入
one little two little three little boys
样例输出
5
AC代码:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
map<string, int> mp;
int main(){
string a,b;
getline(cin,a);
int num = 0;
for(int i = 0; i < a.size(); i++){
if(a[i] == ' '){
mp[b]++;
if(mp[b] == 1)
num++;
b = "";
}else{
b += a[i];
}
}
if(b != ""){
mp[b]++;
if(mp[b] == 1)
num++;
}
cout<<num<<endl;
return 0;
}
[蓝桥杯] [算法提高VIP] 五次方数
题目描述
对一个数十进制表示时的每一位数字乘五次方再求和,会得到一个数的五次方数
例如:1024的五次方数为1+0+32+1024=1057
有这样一些神奇的数,它的五次方数就是它自己,而且这样的数竟然只有有限多个
从小到大输出所有这样的数
输入
无
输出
每个数独立一行输出
样例输入
无
样例输出
无
AC代码,注意上边界即可9^5=59049,那五个这么多就是295245,上边界以这个就行了:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
for(int i = 10; i <= 295245; i++){
int c = i;
int num = 0;
while(c){
int a = c % 10;
num += a * a * a * a * a;
c /= 10;
}
if(num == i)
printf("%d\n",i);
}
return 0;
}
[蓝桥杯] [算法提高VIP] 数字黑洞
题目描述
任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数中含有0,则得到的数不足四位);
3)求两个数的差,得到一个新的四位数(高位零保留)。
重复以上过程,最后一定会得到的结果是6174。
比如:4312 3087 8352 6174,经过三次变换,得到6174
输入
一个四位整数,输入保证四位数字不全相同
输出
一个整数,表示这个数字经过多少次变换能得到6174
样例输入
4312
样例输出
3
AC代码:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int six(int n){
int a[4] = {0};
int index = 0;
while(n){
a[index++] = n % 10;
n /= 10;
}
sort(a,a+4);
int minx = a[0]*1000 + a[1] * 100 + a[2] * 10 + a[3];
int maxx = a[3]*1000 + a[2] * 100 + a[1] * 10 + a[0];
return maxx - minx;
}
int main(){
int n;
cin>>n;
int num = 0;
while(six(n) != 6174){
num++;
n = six(n);
}
cout<<num+1<<endl;
return 0;
}