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;
}