HHTC_2020蓝桥训练(一)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值