今天下午進行了為期三個小時的覆盤賽,說一下感受
相比於比賽時的緊張這次做起來除了做後幾個題緊張,其餘題倒是沒有那種大腦空白的感覺,但是後面有幾個題還是相當棘手,程式碼量和思維跳躍都比較大,所以l2憑目前能力只做了兩個,l1最後一個耗費時間也會多了,也有最後一個小時主攻l2的張總的作息表了,反正l2比l1難度上漲了是肯定的,另外l2沒做夠l3就沒做
當然,在家做和比賽當時做肯定是不一個心態了,這一點還是要承認的
當然在此之外還發現了一些問題,就是關於自己在某些知識上還存在空缺和遺忘,比如處理染色和dfs相結合的問題,還有就是對於最短路徑複雜化的一個問題,還有就是關於STL的一些應用
下面是關於一些題目的解析:
前兩道題簡單水題
第三題:
if-else來回巢狀系列,麻煩且噁心,但思維上不算是難題,難在一步步拆解和巢狀上
1 #include<bits/stdc++.h>//天梯賽3 2 using namespace std; 3 int y1, y2, a, b; 4 int main() 5 { 6 cin >> y1 >> y2 >> a >> b; 7 if (a >b)//分兩種情況,分別輸出兩者的序號 8 { 9 if (b >= y1)//小者年齡大於可進入年齡,兩者都可 10 { 11 cout << a << "-Y " << b << "-Y" << endl; 12 cout << "huan ying ru guan" << endl; 13 } 14 else if (b < y1 && a >= y2)//小者年齡小於兒童進入年齡但有大人陪同 15 { 16 cout << a << "-Y " << b << "-Y" << endl; 17 cout << "qing 1 zhao gu hao 2" << endl; 18 } 19 else if (a <y1)//都不行 20 { 21 cout << a << "-N " << b << "-N" << endl; 22 cout << "zhang da zai lai ba" << endl; 23 } 24 else if (b < y1 && a < y2)//只有一個行 25 { 26 cout << a << "-Y " << b << "-N" << endl; 27 cout << "1: huan ying ru guan" << endl; 28 } 29 } 30 else//同上 31 { 32 if (a >= y1) 33 { 34 cout << a << "-Y " << b << "-Y" << endl; 35 cout << "huan ying ru guan" << endl; 36 } 37 else if (a < y1 && b >= y2) 38 { 39 cout << a << "-Y " << b << "-Y" << endl; 40 cout << "qing 2 zhao gu hao 1" << endl; 41 } 42 else if (b < y1) 43 { 44 cout << a << "-N " << b << "-N" << endl; 45 cout << "zhang da zai lai ba" << endl; 46 } 47 else if (a < y1 && b < y2) 48 { 49 cout << a << "-N " << b << "-Y" << endl; 50 cout << "2: huan ying ru guan" << endl; 51 } 52 } 53 return 0; 54 }
4水
5:還是說一下吧
題目最後得出的結果必定是最大的(拋去最大值和與原本元素重複的),那麼這個採取的策略可以是先預處理讓其變到當前的最大,然後在進行後面輪數的處理
對於後面的處理如果和原本元素相同就遞減2,否則為1;
1 #include<bits/stdc++.h>天梯賽5 2 using namespace std; 3 int a[10]; 4 int b[10];//預存變數,保證原來元素不受影響 5 int n; 6 int main() 7 { 8 std::ios::sync_with_stdio(false); 9 cin.tie(0); 10 cout.tie(0); 11 for(register int i=1;i<=6;i++)//預處理 12 { 13 cin>>a[i]; 14 b[i]=a[i]; 15 } 16 cin>>n; 17 for(register int i=1;i<=6;i++) 18 { 19 if(a[i]==6) //重複遞減2 20 a[i]--; 21 else //1 22 a[i]=6; 23 } 24 25 for(register int i=1;i<=n-1;i++) 26 { 27 for(register int j=1;j<=6;j++) 28 { 29 a[j]--; 30 if(a[j]==b[j]) 31 a[j]--; 32 } 33 } 34 for(register int i=1;i<6;i++) { 35 cout<<a[i]<<" "; 36 } 37 cout<<a[6]<<endl; 38 return 0; 39 }
7沒啥賣點;
6
有一個有意思的地方是字串,其餘照著題面來
#include<bits/stdc++.h>//天梯賽6 using namespace std; int main(){ string a,b,s1="",s2=""; int i,j,k,l,m,n; cin>>a>>b; for(i=1;i<a.length();i++) { if((a[i]-'0')%2==(a[i-1]-'0')%2){ s1 += max(a[i], a[i-1]); } } for(i=1;i<b.length();i++) { if((b[i]-'0')%2==(b[i-1]-'0')%2){ s2 += max(b[i], b[i-1]); } } if(a.length()==1) s1+=a[i]; if(b.length()==1) s2+=b[i]; if(s1==s2) cout<<s1; else cout<<s1<<endl<<s2; }
8.讀題費勁,讀懂題意處理起來就好做了,其實還是貴在閱讀理解,得多做做長題面的題來學習一下了;
1 #include<iostream>//天梯賽8 2 using namespace std; 3 int a[1000];//每個分段的達標人數 4 int n,k,s; 5 int sum; 6 int main() 7 { 8 cin>>n>>k>>s; 9 for(register int i=1;i<=n;i++) 10 { 11 int x,y; 12 cin>>x>>y; 13 if(x>=175) 14 { 15 if(y>=s) sum++; //特殊的不受批次影響 16 else if(a[x]<k) 17 { 18 a[x]++; 19 sum++; //普通的受批次影響的 20 } 21 } 22 } 23 cout<<sum; 24 return 0; 25 }
下面是L2題目:
L2相比L1而言題目難度無疑是上升一個層面的,資料結構的應用很多也很靈活,其中不乏對於樹圖的處理和棧,佇列的應用,當然,也有可能存在連結串列
難度不低,謹慎食用;
L2-1
暫時不太會,但基本思路是確定用棧與佇列雙模擬了,明天補題
L2-2張總的作息表
轉化時間這一步是必要的,然後進行結束時間排序,因為只有結束了才能開始下一段區間,參考部分揹包思想
以上是預處理
下面是正式處理
首先是處理兩個情況,即兩個臨界點
凌晨從開始時間到第一個結束的時間,這是第一個時間段
在處理其餘的時間,就是從一段結束的時間到下一段開始的時間
然後是另外一個臨界點23點近24點;
處理方式同0點
1 #include<bits/stdc++.h>//天梯賽l2張朝陽的作息表 2 using namespace std; 3 const int num = 1e5; 4 struct times 5 { 6 int begin1; 7 int end1; 8 }t[num]; 9 10 bool cmp1(times x , times y){ 11 return x.end1 < y.end1; 12 } 13 int main(){ 14 std::ios::sync_with_stdio(false); 15 cin.tie(0); 16 cout.tie(0); 17 int n; 18 cin >> n; 19 for(int i = 0 ; i <n ; i ++) 20 { 21 int h1=0,m1=0,s1=0,h2=0,m2=0,s2=0; 22 scanf("%d:%d:%d - %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2); 23 t[i].begin1 = h1*3600 + m1 * 60 + s1; 24 t[i].end1 = h2*3600 + m2 * 60 + s2; 25 } 26 27 sort(t,t+n,cmp1); 28 29 if(t[0].begin1 != 0){ 30 int h3=0; 31 int m3=0; 32 int s3=0; 33 int h4=0; 34 int m4=0; 35 int s4=0; 36 h4 = t[0].begin1 / 3600; 37 m4 = t[0].begin1 / 60 % 60; 38 s4 = t[0].begin1 % 60; 39 printf("00:00:00 - %02d:%02d:%02d\n",h4,m4,s4); 40 } 41 42 for(int i = 0 ; i < n - 1 ; i ++){ 43 if(t[i].end1 != t[i+1].begin1){ 44 int h3,m3,s3,h4,m4,s4; 45 h3 = t[i].end1 / 3600; 46 m3 = t[i].end1 / 60 % 60; 47 s3 = t[i].end1 % 60; 48 h4 = t[i+1].begin1 / 3600; 49 m4 = t[i+1].begin1 / 60 % 60; 50 s4 = t[i+1].begin1 % 60; 51 printf("%02d:%02d:%02d - %02d:%02d:%02d\n",h3,m3,s3,h4,m4,s4); 52 } 53 } 54 55 if(t[n-1].end1 != 23*3600 + 59 * 60 + 59){ 56 int h3,m3,s3,h4,m4,s4; 57 h3 = t[n-1].end1 / 3600; 58 m3 = t[n-1].end1 / 60 % 60; 59 s3 = t[n-1].end1 % 60; 60 printf("%02d:%02d:%02d - 23:59:59",h3,m3,s3); 61 } 62 return 0; 63 }
L2-3沒做
L2-4是複雜化佛洛依德演算法,明天更
L3一個沒做
分割線 2022/6/22/21:10
------------------------------------------------------------------------------------