一 : 題目描述
今年是2021年,請問數字1到數字2021中,出現了多少個數字6。
簽到題:
#include <stdio.h> int main() { int i, j, ans = 0; for(i = 1; i <= 2021; i++){ j = i; while(j){ if(j % 10 == 6)ans++; j /= 10; } } printf("%d\n",ans); return 0; }
二 題目描述 :
小明同學正在學習一種新的語言。在該語言中,如果出現了一次wa或者一次aw,則代表出現了一個警告。如果出現了連續的wa或者連續的aw,則代表出現了一個錯誤。小明由於學習比較粗心,所以他想要知道自己剛剛寫完的作業中一共出現了多少處警告和錯誤。下面是小明剛剛寫完的作業,請你幫助小明找到他一共出現了多少次警告和多少次錯誤。
waawwaawwawa中出現了四次警告(兩次wa和兩次aw)和一次錯誤(wawa)
awawwawa中只出現了兩次錯誤(awaw和wawa)
abcwaawawawa中出現了一次警告(wa)和一次錯誤(awawaw)
abcdefg中沒有出現一次警告和錯誤
waawwaawwawa中出現了四次警告(兩次wa和兩次aw)和一次錯誤(wawa)
awawwawa中只出現了兩次錯誤(awaw和wawa)
備注:
小明的作業如下:
iawaswapwauawhawdwafwanbiopwanivgbikvblvbwawawawvolyuvgbololvolgbyolgyowagbolgawgboplwawaolgyolwaogblwaygbowawagwabwayawopwawagyowabwaowapjwapcfrtuywawacvujwawawaufttyfuftywawawatifgugbgbyguwawawawayugbigwwwytigwygwgbwyoawawgoghwaogwborgrewabouyhwabyuhowabhnwawauygbawyawuwaoawfcawaaaahwaywauwagwawefwaafmbawklawjiawihnwanhawawawawijwajiofjeriofgjrefjhwaewarwaowagwahwauwaiwarwaiwaqwarwahwaqwawwaowapfweofbwewafwahwaiwaewawwawawawawafwawawawaeiufwepfhnewfwahwajwatwafowawajtokshwawafwaiwahwafwahmgoewawawawafkfjkewnwawafiewhfwawawafjkernhawkrenwawawawafujnrheiowanwakawawawawwanoifewajrwaoawawfweojnwawawawawawawafjkwenawawferkwmpwawawawaforeijawawferhfiueorghwuwafguwegfwaghrwiufgwahweofgowaidwiweaiwwawieyiwe
這題,遍歷一下子串就OK了;
找到a並且下一個是w,或者找到w下一個是a的情況,進入while循環,flag + 1,此時flag = 1;
如果找到的aw並且下兩個還是字符還是aw的話flag 再 + 1;即flag > 1的話,算上前面的aw說明這是個錯誤,若flag = 1的話說明這是個警告;
#include <stdio.h> #include <string.h> #include <math.h> char s[10000005]; int main() { int i, l, flag, ans = 0, cnt = 0;//ans 為警告,cnt 為錯誤; gets(s); l = strlen(s); for(i = 0; i < l; i++) { flag = 0; while(s[i] == 'a' && s[i + 1] == 'w') { i += 2; flag++; } if(flag == 1)ans++; else if(flag > 1)cnt++; flag = 0; while(s[i] == 'w' && s[i + 1] == 'a') { i += 2; flag++; } if(flag == 1)ans++; else if(flag > 1)cnt++; } printf("%d\n%d\n",ans,cnt); return 0; }
三 題目描述:
小明最近痴迷於斐波那契數列(1,1,2,3,5……),但是最近他又有了新的奇思妙想,就是對於斐波那契數列的相鄰的兩個數相乘取倒數然后將每一項進行相加,由於小明只喜歡思考不喜歡動手,所以現在他想讓 你幫他算下這樣一個新的數列的前13項的和為多少?(結果用分數表示,且保留最簡分數)
思路:
直接加,從頭加到尾,中間過程不斷進行約分(分子,分母都除以最大公約數);
最起初,第一個數據為 1/(1*1), 即為 1, 分子,分母都為1;定義變量 fenzi = 1,fenmu = 1;
在得到第二個組數 1/(1*2)的時候, 定義變量 fenmu1 = (1 * 2),然后進行分母同分,再定義變量 fenmu2 = fenmu * fenmu1 / gcd(fenmu, fenmu1),求最小公倍數;根據數學運算可以得出 fenzi, 然后fenmu = fenmu2(更新分母的值);
#include "stdio.h" long long gcd(long long a, long long b){ return b ? gcd(b, a % b) : a; } int main(){ int i, j, n; long long a[15], k, fenzi, fenmu, fenzi_, fenmu1, fenmu2; n = 13; a[1] = 1;a[2] = 1; for(i = 3; i <= 14; i++){ a[i] = a[i - 1] + a[i - 2]; } fenzi = 1, fenmu = 1; for(i = 2; i <= n; i++){ fenmu1 = a[i] * a[i + 1]; fenmu2 = fenmu * fenmu1 / gcd(fenmu, fenmu1); fenzi = fenmu2 / fenmu1 + fenmu2 / fenmu * fenzi; fenmu = fenmu2; k = gcd(fenzi, fenmu);//這里k就是再約分 分子和分母 fenzi = fenzi / k; fenmu = fenmu / k; } printf("%lld/%lld\n",fenzi,fenmu); return 0; }
四 題目描述:
小明同學最近喜歡上了排列組合,但是現在有這樣的一道題把他難住了,已知有一組數字(2,5,3,6,3,6,7,3,7,8)共10個,對於這組數字進行排列后,可以將排列好的數字分為三個部分,且三個部分都是 分別有序的(升序或逆序),小明想知道能夠有滿足條件的多少種排列方式?
備注:
例如對於重新排列后的一種序列(2, 3, 3, 3, 5, 6, 6, 7, 7, 8)可以分為(2)(3,3,3)(5,6,6,7,7,8)三組或(2,3,3)(3,5,6,6)(7,7,8)三組所以該序列為滿足題意的一種排列方式。
思路:
用DFS對這十個數經行全排列,排列好檢查是否滿足條件,滿足條件ans++;
注意的地方就是這是個數里面有3 個 3,2 個 7,2 個 6;也就是說最后的結果要除以3!* 2!* 2!用來避免重復!
#include "stdio.h" int b[10] = {2,5,3,6,3,6,7,3,7,8}; int a[10], book[10]; int n, ans = 0; int check() { int i, j, flag = 0, cnt = 0; for(i = 0; i < n - 1; i++){ if(a[i] < a[i + 1]){ if(flag == -1){ cnt++; flag = 0; }else{ flag = 1; } }else if(a[i] > a[i + 1]){ if(flag == 1){ cnt++; flag = 0; }else{ flag = -1; } } } if(cnt <= 2) return 1; return 0; } void dfs(int x) {//dfs全排列 int i, j, k; if(x == 10) { if(check() == 1) { ans++; return; } return; } for(i = 0; i < n; i++) { if(book[i] == 0) { book[i] = 1; a[x] = b[i]; dfs(x + 1); book[i] = 0; } } } int main() { int i, j; n = 10; dfs(0); printf("%d\n",ans / 24); return 0; }
六 : 題目描述:
又是努力刷題的一天。眾所周知wyk是國一大佬喜歡幫群友解答問題。
現在xmy好奇群里的聊天記錄有多少條是@wyk的,但是他在忙着摸魚。
所以找到了你,給了你N條聊天記錄,讓你幫他算一下。
注意:保證聊天記錄的字母都是
在ASSIC內。聊天記錄存在空格,也可能以空格開頭或結尾。@wyk必須連續才能生效,一條聊天記錄保證在一行。
輸入描述:
第一行一個整數N
(1 ≤ N ≤ 10000)
接下來N行字符串
(1 ≤l en(S) ≤ 200)
輸出描述:
輸出聊天記錄有多少條是@wyk的
輸入
10 abcbdaasddwj@wyk dasdsafav@Alan acdbbd@alan@wyk @zbrnb ??CC?? abababab wgyyds @wykyyds @wyk 111 endcccc@wyk
輸出
5
#include <stdio.h> #include <string.h> int main() { char s[1000000]; int n, i, j, l, ans = 0; scanf("%d",&n); getchar(); for(i = 0; i < n; i++){ gets(s); l = strlen(s); //getchar(); for(j = 0; j < l; j++){ if(s[j] == '@' && s[j + 1] == 'w' && s[j + 2] == 'y' && s[j + 3] == 'k'){ ans++; break; } } } printf("%d\n",ans); return 0; }
七 題目描述:
這一天你來到了藍橋杯的考場,你發現考場是一個N*M的矩陣。
因為你的群友很多,你知道考場內每個人有多強,並且把實力換算成了數值。
(
因為有的人太弱了,所以可能出現實力值是負數的可能
)
你想知道考場內實力總和最大的
矩陣
區域的實力和是多少
輸入描述:
第一行兩個整數 N M
第二到N+1行是一個N*M的矩陣代表考場內的情況
(−200 <= 實力值 <= 200)
輸出描述:
請輸出考場內實力總和最大的矩陣區域的實力和是多少
示例1
輸入
3 2 8 9 10 11 -4 11
輸出
45
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll n, m, x;
ll ans = -1e9 + 7;
cin >> n >> m;
ll a[n + 5][m + 5];
for(int i = 1; i <= n; i++) {
for(int j =1; j <= m; j++) {
cin >> x;
a[i][j] = a[i][j - 1] + x;
}
}
for(int i = 1; i <= m; i++) {
for(int j = 0; j < i; j++) {
ll c = 0;
for(int k = 1; k <= n; k++) {
c = c + a[k][i] - a[k][j];
ans = max(ans, c);
if(c < 0) c = 0;
}
}
}
cout << ans << endl;
return 0;
}
