AcWing 第29場周賽
阿新 • • 發佈:2021-12-12
比賽連結
AcWing 4194. Pow
難度:簡單
知識點:數學,輸出流控制
思路:呼叫數學庫中的pow
參考程式碼:
#include<iostream> #include<cmath> #include<iomanip> using namespace std; int main() { int n,t; cin>>n>>t; //precision 精確度 cout<<setprecision(6)<<std::fixed<<n*pow(1.00011,t); return 0; }
AcWing 4195. 線段覆蓋
難度:中等
知識點:差分
思路1:掃描線
思路2:差分,l、r的資料範圍1e18,沒法構建差分陣列,可以使用map來記錄
參考程式碼2
#include<iostream> #include<cstdio> #include<map> using namespace std; const int N=200010; typedef long long LL; map<LL,int> b;//<邊界,線段覆蓋數>差分陣列,map可以自動排序 LL ans[N];//儲存答案 int main() { int n; scanf("%d", &n); //差分,將區間(l,r)加1 for(int i=0;i<n;i++) { LL l,r; //超過1e5的輸入最好使用scanf scanf("%lld%lld",&l,&r); b[l]++,b[r+1]--; } LL sum=0,last=-1;//sum表示線段覆蓋數,last表示上一條邊界 for(auto &[k,v]:b)//加&可以減少複製的時間 { if(last!=-1) ans[sum]+=k-last; sum+=v; last=k; } for(int i=1;i<=n;i++) printf("%lld ",ans[i]); return 0; }
AcWing 4196. 最短路徑
難度:困難
知識點:圖論
思路:spfa求最短路,模板題+存上一個節點
參考程式碼:
#include<iostream> #include<cstring> using namespace std; typedef long long LL; const int N=100010,M=200010;//由於是無向邊,所以邊要點多一倍 int h[N], e[M], w[M], ne[M], idx;//鄰接表儲存 int q[N],pre[N];//儲存走過的下,上一個節點,方便回溯找路徑 LL dist[N];//儲存距離 bool st[N];//表示是否被遍歷過 int path[N];//儲存走過的路徑 void add(int a, int b, int c) // 新增一條邊a->b,邊權為c { e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ; } void spfa() // 求1號點到n號點的最短路距離 { int hh = 0, tt = 0; memset(dist, 0x3f, sizeof dist); memset(pre,-1,sizeof pre); dist[1] = 0; q[tt ++ ] = 1; st[1] = true; while (hh != tt) { int t = q[hh ++ ]; if (hh == N) hh = 0; st[t] = false; for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (dist[j] > dist[t] + w[i]) { dist[j] = dist[t] + w[i]; pre[j]=t; if (!st[j]) // 如果佇列中已存在j,則不需要將j重複插入 { q[tt ++ ] = j; if (tt == N) tt = 0; st[j] = true; } } } } } int main() { int n,m; cin>>n>>m; memset(h, -1, sizeof h); while (m -- ){ int a,b,c; cin>>a>>b>>c; add(a, b, c),add(b,a,c);//無向邊,新增兩次 } spfa(); if(pre[n]==-1) cout<<-1;//無法到達終點 else { int cnt=0;//記錄經過點的個數 for(int i=n;i!=-1;i=pre[i]) path[cnt++]=i; for(int i=cnt-1;i>=0;i--) cout<<path[i]<<' '; } return 0; }
總結不足:
1、C++的輸出控制
2、複習基礎課,差分+spfa
3、C++各種容器的使用