做網(wǎng)站跳轉(zhuǎn)揚州網(wǎng)站推廣公司
?1、握手問題
知識點:模擬
????????這道題很簡單。但是不知道考試的時候有沒有寫錯。一開始的43個人握手,僅需要兩兩握手,也就是從42個握手開始,而非43.很可惜。這道題沒有拿穩(wěn)這5分。也很有可能是這5分導致沒有進決賽。
總結(jié):
1、將題目要求的大的數(shù)值進行抽象出來,例如寫成一個變量m,n。
2、然后,使用較小的數(shù)字,將m設置為5,n設置為3。
3、然后手算看看結(jié)果是否與程序相同。
4、相同的話,再使用題目要求的數(shù)值填入n和m中。
#include<bits/stdc++.h>
using namespace std;
long long cnt;
const int n = 50; // 總?cè)藬?shù)
const int m = 43; // 無需特殊處理的人數(shù)
int main()
{// 先處理前面沒有限制的43個人。 他們之間兩兩握手for (int i = m-1; i >= 1; i--) // 注意這里不是43,而是42{cnt += i;}// 后處理有限制的7人 他們分別與上述43人握手cnt += 43 * (n-m);cout << cnt;return 0;
}
2、小球反彈
看著很難,考試的時候直接放棄了,現(xiàn)在也沒有去寫正解。
3、好數(shù)
知識點:模擬
????????邏輯非常簡單,10分鐘不到就能夠?qū)懗鰜?。但是考試的時候很緊張,寫了20分鐘。沒有很清晰的寫出下標之間的關(guān)系,當時很亂。
????????最終結(jié)果:100分。折算后:10分
#include<bits/stdc++.h>
using namespace std;
int n;
int cnt;
int main()
{cin >> n;for (int i = 1; i <= n; i++){string str = to_string(i);int len = str.size(); // 獲取數(shù)字的長度int b = 1; // 當前位數(shù)int j;for (j = len - 1; j >= 0; j--) // 從數(shù)字末尾開始判斷{if (b % 2 == 1) // 需要檢測當前奇數(shù)位數(shù)的數(shù)值為奇數(shù){if (str[j] % 2 == 1){b++;continue;}elsebreak;}else // 檢測當前偶數(shù)位的數(shù)值是否為偶數(shù){if (str[j] % 2 == 0)b++;elsebreak;}}if (j == -1)cnt++;}cout << cnt << endl;return 0;
}
4、R格式
?知識點:高精度。
????????高精度類型的題目我?guī)缀鯖]有做過。所以當時看到是很慌的。本題浮點數(shù)的位數(shù)很大,我僅僅使用double進行存儲,肯定只能通過極少數(shù)的測試樣例。
????????最終結(jié)果:本題拿到24分。折算為題目的分數(shù)就是:10*0.24 = 2.4分
????????當時考試過程中,想到了使用string來存儲,但是寫了半天,還是不知道怎么處理。
????????最終寫出來的效果是:string解決位數(shù)較低的情況,和直接使用double存儲應該沒兩樣。當時還不如直接使用double存儲。。。
????????后面想著時間還剩多的話,就回來寫用string解決位數(shù)較高的情況。但是后面還是沒能回來。
#include<bits/stdc++.h>
using namespace std;
int n;
double d;
int main()
{cin >> n >> d;long long temp = pow(2, n);double pre = d * temp;// 進行四舍五入——采用笨方法string str = to_string(pre);int i;for (i = 0; i < str.size(); i++){if (str[i] == '.')break;}// 判斷小數(shù)點后一位是否小于5if (str[i + 1] < 5)cout << int(pre) << endl;else{cout << int(pre) + 1 << endl;}return 0;
}
5、寶石組合
知識點:最大公因數(shù)、最小公倍數(shù)、XXX
????????考試中,看到題目,就想到了使用dfs,dfs在考試前,自己練了好多道題目了。后來發(fā)現(xiàn),直接使用for循環(huán),也可以得到答案。很像沒有必要使用dfs??荚囍?#xff0c;浪費了很多時間進行dfs編碼,最終寫的還是簡單的for循環(huán)。
經(jīng)驗:
1、寫完gdc和lcm函數(shù)后,先測試一下。
2、先想出整個題目的思路,再進行編碼。
3、先想想有沒有什么簡單的思路,在考試中先使用簡單的思路進行求解。有時間再回來寫正解。
結(jié)果:時間超時,但是拿到了33分。折算后就是:15*0.33 = 5分
#include<bits/stdc++.h>
using namespace std;
int n;
long long Max = -1;
int res[3];
int gcd(int a, int b)
{while (a % b != 0){int r = a % b;a = b;b = r;}return b;
}int lcm(int a, int b)
{return a * b / gcd(a, b);
}
int main()
{cin >> n;vector<int> v(n, 0);for (int i = 0; i < n; i++){cin >> v[i];}sort(v.begin(), v.end());for (int i = 0; i < n; i++){for (int j = i + 1; j < n; j++){for (int k = j + 1; k < n; k++){long long p1 = v[i] * v[j] * v[k];long long p2 = lcm(v[i], v[j]);long long p3 = lcm(v[i], v[k]);long long p4 = lcm(v[j], v[k]);long long p5 = lcm(p2, v[k]);long long temp = p1 * p5 / (p2 * p3 * p4);if (temp > Max){Max = temp;res[0] = v[i];res[1] = v[j];res[2] = v[k];}}}}for (int i = 0; i < 3; i++){cout << res[i] << " ";}return 0;
}
?6、數(shù)字接龍
知識點:dfs、bfs
????????老毛病了:寫了40分鐘,發(fā)現(xiàn)自己題目都沒有完全搞懂。思路沒有捋順就開始編程。
????????中途發(fā)現(xiàn),自己平時練習的bfs和本題還是有區(qū)別的。這道題還要存儲路徑過程。我很少練這個。
????????最終考試提交的就是一堆不完整的代碼。但是寫了-1的情況,所以花了40分鐘,最終和花1分鐘寫的效果一樣。
????????出乎意料的是,直接輸出-1居然在dot.cpp網(wǎng)站上能通過超過一半的測試樣例, 拿到了55分!!!折算后:15*0.55 = 8分
#include<bits/stdc++.h>
using namespace std;
int main()
{cout << -1 << endl;return 0;
}
?7、爬山
知識點:貪心算法
????????使用貪心策略,只考慮當前的最優(yōu)解。即,先對高山進行大到小排序,魔法提前使用。
????????這樣子寫肯定不是正解,但是在考場上,我當時的水平只能這么寫著先了。
????????考場上的策略不太行,應該使用別的策略。
????????我當時想的是:排完序后,就對山施展魔法,直至改山比第二座山低,就對下一座山施展魔法。
????????現(xiàn)在回想起來,存在漏洞,第一座山比第二座山低了之后,應該將第一座山插至山序列的恰當位置,而非不處理。
????????以下程序是修復漏洞后的程序,通過3個測試用例,其余測試用例超時。有一個測試用例答案錯誤。得分:25。折算后:20*0.25 = 5
其實這題,要是不清楚優(yōu)先使用魔法1還是2,也可以專門寫一個針對20%的測試用例的,只使用魔法2。
#include<bits/stdc++.h>
using namespace std;
int n;
int p;
int q;
//bool cmp(int a, int b)
//{
// return a > b;
//}int main()
{cin >> n >> p >> q;vector<int> v(n, 0);for (int i = 0; i < n; i++){cin >> v[i];}sort(v.rbegin(), v.rend()); // 遞減排序// 求不等式:x/2>根號x 求得:當x>4時,使用/,即使用魔法2時,作用效果沒有使用魔法1的好。/*易錯點:上述條件對于實數(shù)成立。但是題目中,魔法2還可以向下取整。當x<=4時,均為魔法2的效果更加。當x = 5時,使用魔法1,變成了2.23; 使用魔法2,變成了2 魔法2更佳當x = 6時,使用魔法1,變成了2.4; 使用魔法2,變成了3 魔法1更佳當x = 7時,使用魔法1,變成了2.6; 使用魔法2,變成了3 魔法1更佳綜上所屬,x<=5時,使用魔法2;x>5時,使用魔法1*/// 始終都對第一座最大的山使用魔法while (p || q){if (v[0] > 5) // 優(yōu)先使用魔法1{if (p > 0) // 魔法1還可以使用{v[0] = sqrt(v[0]);if (n > 1){if (v[0] < v[1]) //使用魔法后比后面的小,需要重新排序sort(v.rbegin(), v.rend());}p--;}else{if (q > 0){v[0] /= 2;if (n > 1){if (v[0] < v[1]) //使用魔法后比后面的小,需要重新排序sort(v.rbegin(), v.rend());}q--;}}}else // 優(yōu)先使用魔法2{if (q > 0) {v[0] /= 2;if (n > 1){if (v[0] < v[1]) //使用魔法后比后面的小,需要重新排序sort(v.rbegin(), v.rend());}q--;}else{if (p > 0) // 魔法1還可以使用{v[0] = sqrt(v[0]);if (n > 1){if (v[0] < v[1]) //使用魔法后比后面的小,需要重新排序sort(v.rbegin(), v.rend());}p--;}}}}long long ans = 0;for (int i = 0; i < n; i++){ans += v[i];}cout << ans;return 0;
}
8、接龍
知識點:前綴和
????????這道題考試的時候沒有做,直接輸出的用例答案,應該0分。
????????本次考試過程中,我很多題目都太渴望求正解,以致于解決速度慢,還不如直接暴力解。
再加上緊張所以編程不能冷靜,return 0 又沒有寫,第一題又粗心了。所以排名二等獎墊底。
????????要是解決上述問題,并且把拔河這題寫了,就能夠拿到省一了!!!
????????考試的時候,沒有注意到題目說明了所選的每組人編號是連續(xù)的。且第2組人編號一定大于第1組人的
????????自己考試的時候,把題目想復雜了,以致于這道題沒有進行解答。
????????解法一:選上所有選手,但題目并未這么要求。
????????答案錯誤。通過一個測試用例,答案拿了9分。折算后為:20*0.09= 1.8
#include<bits/stdc++.h>
using namespace std;
int n;
int Min = 1e9;
int main()
{cin >> n;vector<int> v(n + 1, 0);vector<long long> vs(n + 1, 0);for (int i = 1; i <= n; i++){cin >> v[i];vs[i] = vs[i - 1] + v[i];}for (int i = 1; i < n; i++) // 第一組選擇前i個人,第一組不可能選所有人,否則第2組沒人可選了。{long long grp1 = vs[i];long long grp2 = vs[n] - vs[i];long long temp = abs(grp1 - grp2);if (temp < Min)Min = temp;}cout << Min << endl;return 0;
}
????????解法2:使用了4層循環(huán),標記選手范圍的l1,r1,l2,r2。非常好理解。注意一下下標,不要寫錯即可。
????????通過3個測試用例。得分27,超時。折算后:20*0.27 = 5.4?
#include<bits/stdc++.h>
using namespace std;
int n;
int Min = 1e9;
int main()
{cin >> n;vector<int> v(n + 1, 0);vector<long long> vs(n + 1, 0);for (int i = 1; i <= n; i++){cin >> v[i];vs[i] = vs[i - 1] + v[i];}for (int l1 = 0; l1 < n; l1++) // l1位置{for (int r1 = l1 + 1; r1 < n; r1++) // r1位置{long long grp1 = vs[r1] - vs[l1];for (int l2 = r1; l2 <= n; l2++){for (int r2 = l2 + 1; r2 <= n; r2++){long long grp2 = vs[r2] - vs[l2];long long temp = abs(grp1 - grp2);if (temp < Min)Min = temp;}}}}cout << Min << endl;return 0;
}
經(jīng)驗總結(jié):
1、看清楚題目限制條件。
????????例如:題目講到的拔河人數(shù)序號一定是遞增的——這就導致不會說,有1、2、3、4、5個人,選15一組,24一組。而是一定是選連續(xù)的人為1組。這就極大地簡化了題目的難度。
2、比賽過程中,不要總是想著上來就求解正解。而是先去嘗試純暴力解法,以節(jié)約時間。
????????有時候題目純暴力也需要花很多時間來解決。先做出了純暴力的解法,留夠充足的時間后面再做正解,而且前面的純暴力會為后續(xù)提供思路的。
3、一定一定有了完整的思路、明確這么做是正確的(超時也沒關(guān)系),才開始編程。
????????編程切忌沒有思路,或者是有了一丟丟思路就開始編程。這樣子的效率極低。而且容易在遇到某個解決不了的問題時,前功盡棄,徒勞而費。
4、學會使用抽象編程。
????????例如第一題,將某個變量抽象后,就可以使用某個數(shù)值較小的測試用例來檢驗程序的正確,以保證不因粗心丟分。
5、今天靜下心來,沒有壓力的情況下,拿了40.5分。這個分數(shù)應該可以拿省一的。
????????感覺自己練的題目也不少,但是自己最終拿到的獎項還是有點弱了。還是自身應試能力不強,編程經(jīng)驗缺乏,水平?jīng)]有發(fā)揮到位。如果有小伙伴想要沖藍橋杯省一的,一定要提前跟著網(wǎng)上的視頻,覆蓋知識點后,再進行刷題。題目不管難易,都從暴力解出發(fā),正確每道題目都能拿下一定的分數(shù)。