當各位小伙伴們看到這篇文章的時候想必藍橋杯也快開賽了,那么本篇文章博主就來總結一下一些藍橋杯的應賽技巧,那么依舊先來走個流程
那么接下來我們分成幾個板塊進行總結
首先是一些基本語法
編程語言的基本語法
首先是數組,在存數據的時候,建議先從1開始存,為啥這么干呢,博主在刷題的過程中有幾次因為下標從0開始存,導致最后在理解上出現了一些不必要的麻煩。這里我有必要說一下藍橋杯第十五屆回文數組這題,當時就是因為數據從0開始存導致在理解上繞了好大的彎才想明白。
其次是指針,對于大一的小伙伴們或許還是用當初那個模板——類型 *指針名,不用想這么復雜,直接用數組的下標代替即可,我們需要將指針作為一個思維而非死用模板。
最后是設置類型上,建議各位小伙伴直接使用long long 類型,這樣可以避免出現一些數據因為類型范圍小而溢出,從而出現一些麻煩
那么接下來就到了編程的技巧板塊
填空題技巧
技巧一:巧用excel
參考例子:藍橋真題講解-CSDN博客
技巧二:巧用python
其實博主不太推薦技巧二,因為賽場上不一定有pycharm,看情況而定吧
編程技巧
取出一個整數中的某個位的數(個位,十位,百位,千位)
While(條件)
{tmp %= 10;Tmp /= 10;}
這個不建議大家直接當成模板背,建議去理解,而且理解起來也很輕松,當然對于大一只想拿個省獎的同學還是可以考慮記一下的
將某些數存放進哈希表
for(int i = 0; i < n; i++)
{tmp = 數組名[i]hash[tmp] = tmp;
}
經過博主多次考慮決定將之前的模板改成了這個,畢竟是幫助大家,而不是給大家制造麻煩,當然也建議大家先去試試,有問題就在評論區留言,注意哈!這是c++才能用的哦,c語言用了,并且出問題,博主可不背鍋哈!
哈希表統計數
舉兩個例子
非字母的統計
字母的統計
hash[數組名[i] - a]
已經掌握哈希的小伙伴,請忽略這兩點
定義變量時的類型
定義變量時用的類型建議直接用long long 類型(即長整型),并且代碼中所有變量的類型都保持一致,這樣可以避免因超出范圍而出現的bug的麻煩
二維數組的坑
二維數組不能開太大,并且vector<vector<int>>類型的也是一樣不能開太大,怎么判斷自己是否開太大了呢?博主是這么認為的,超過10000的就已經很大了,當然有不同看法的小伙伴歡迎評論區留言,我們可以相互交流一下
數組的創建與傳參
一維數組的定義:類型? ? 數組名[ 元素個數?]? ? ?eg.int arr[10];(用這個也ok),最好放在main函數和其他函數的外面(也就是作為全局變量)
二維數組的定義:類型? 數組名[ 行?][? 列?]?
傳參:
一維數組:
形參部分:類型 函數名(類型 數組名[數組大小])
實參部分: 函數名(數組名,其他參數)
二維數組:
形參部分:類型 函數名(類型數組名[行][列])其中行可以省略,列不可以省略
實參部分:? 函數名(數組名,其他參數)
涉及排序
那么為了避免出現一些不必要的bug,我們可以直接使用sort容器對元素進行排序,那么以下是sort容器的使用模板
sort(數組名【起點位置】, 數組名 + 長度【終點位置】);
sort(數組名【起點位置】, 數組名 + 長度【終點位置】, 函數名);
第二個模板是需要我們自己再寫一個函數,并且只要寫如何排序即可
舉個例子
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
struct node
{int x, y, z;int xw, yw, zw;
}a[N];
bool cmp1(node a, node b)
{return a.xw > b.xw;
}
bool cmp2(node a, node b)
{return a.yw > b.yw;
}
bool cmp3(node a, node b)
{return a.zw > b.zw;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n = 0;cin >> n;for(int i = 1; i <= n; i++) cin >> a[i].x;for(int i = 1; i <= n; i++) cin >> a[i].y;for(int i = 1; i <= n; i++) cin >> a[i].z;for(int i = 1; i <= n; i++){a[i].xw = a[i].x - a[i].y - a[i].z;a[i].yw = a[i].y - a[i].x - a[i].z;a[i].zw = a[i].z - a[i].y - a[i].x;}long long xv = 0, yv = 0, zv = 0, x_ans = 0, y_ans = 0, z_ans = 0;sort(a + 1, a + 1 + n, cmp1);long long i = 1;xv += a[1].xw;while(i <= n && xv > 0){i++;xv += a[i].xw;x_ans++;} sort(a + 1, a + 1 + n, cmp2);i = 1;yv += a[1].yw;while(i <= n && yv > 0){i++;yv += a[i].yw;y_ans++;} sort(a + 1, a + 1 + n, cmp3);i = 1;zv += a[1].zw;while(i <= n && zv > 0){i++;zv += a[i].zw;z_ans++;} if(xv >= 0 && yv >= 0 && zv >= 0) cout << -1;else cout << max(x_ans, max(y_ans, z_ans));return 0;
}
當然僅供參考?
選自藍橋杯三國游戲
拓展:
如果使用了數據結構,如vector
那么上面的模板就得變成下面的
sort(對象名.begin(), 對象名.end());
sort(對象名.begin(), 對象名.end(), 函數名);
去重容器
定義:set<int,int> 對象名
使用案例(僅供參考)
#include<iostream>
#include<bits/stdc++.h>
#include<string>
using namespace std;
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);set<int> q;string s, s2;cin >> s;while(true){for(int i = 1; i < s.size() - 1; i++){if(s[i] == s[i - 1] && s[i] != s[i + 1]){q.insert(i);q.insert(i + 1);}if(s[i] == s[i + 1] && s[i] != s[i - 1]){q.insert(i);q.insert(i - 1);}}if(q.empty()){cout << s;break;}s2.clear();for(int i = 0; i < s.size(); i++){if(q.find(i) == q.end()) s2 += s[i];}s = s2;q.clear();if(s.size() == 0){cout << "EMPTY";break;}}return 0;
}
選自藍橋杯消除游戲
數據交換
第一種交換方式
tmp = a;
a = b;
b = tmp;
第二種交換方式
a = a ^ b;
b = a ^ b;
a = a ^ b;
第三種交換方式
swap(a,b);
注意:swap是一個庫函數,并且c++才能使用!!!
感覺有思路,但又不確定怎么寫
這種情況,我們先不管那些細節問題,如變量聲明,循環條件是什么,先寫出一個大概,將大概的代碼寫完后再去補細節
幾個經典bug
使用各語言對應的輸出語句進行輸出某個過程中的數據
案例1
因為少寫了什么代碼導致最后的結果與預期不同
就比如這題,預期答案是58,但是實際輸出是2,那么如何找到這個問題呢
在sum += judge(……)這行代碼的后面,編寫輸出語句,再次執行程序,我們可以發現它還是只輸出了2
那么還是給大一的小伙伴說一個知識點:如果是正常的for?按理說是不會只輸出一個sum的值(在無特殊情況下),為了讓這個bug出現得更明顯一點,我們還可以在small[x][y]那段代碼后面加輸出語句,如下圖
那么就可以確定這里是有bug的,那么接下來回到我們一開始的代碼原理圖上
結合原理圖和自己所編寫的代碼我們可以發現,兩層for循環只走了了一次(這里是靠走讀代碼的技巧,怎么走讀下面會講)原因是少了'=',那么問題來了,為啥會出現二呢?因為下面還有個judge函數,并且我們傳過去的參數有數組名和a,b兩個變量,進入到judge函數后又會根據我們所寫的執行,所以才會出現2
案例2
在本地能通過,在云端通不過
那么出現這種情況,我們可以優先考慮是否出現數組越界的問題,如上圖就很明顯,條件限制的是i,但對i + 1卻沒有限制導致出現一個越界,此外i從0開始,導致i - 1越界,因此使得本地能通過,而云端通不過。
案例3
如圖所示,這個bug在devc++中表示命名沖突,解決方法:更改一下a和b這兩個變量的名字即可
題型模板
動態規劃
題型特征
背包問題,路徑問題,打家劫舍問題
題型模板
狀態表示
狀態轉移方程
初始化
填表順序
返回值
前綴和
兩個模板
模板一:將動態規劃的模板走一遍(即預處理數組),使用數組
模板二:當前項 + 前一項
詳情可以前往鏈接:藍橋真題講解-CSDN博客進行觀看
差分
核心模板
數組名[l]++;
數組名[r + 1]--;
思路模板:出現差分的地方必有前綴和
?詳情可以前往鏈接:藍橋真題講解-CSDN博客進行觀看
以上模板優先看
其余模板
滑動窗口
題型特征
能用雙指針,就可以考慮是否能用滑動窗口
題型模板
Left = 0, right = 0;
進窗口
判斷
出窗口
👆? 👇//表示循環
更新結果
二分查找
必記點
當然博主的水平有限,不過對于c組小伙伴們來說基本也就差不多了,如果博主的文章能對其他組的小伙伴有所幫助,博主也是倍感榮幸。
當然賽前這幾天這篇文章也還會再更新點內容
最后祝大家旗開得勝!!!