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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章