日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

寒假每日一题(提高组)【Week 4 完结】

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 寒假每日一题(提高组)【Week 4 完结】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 730. 機器人跳躍問題【二分】
  • 3195. 有趣的數【DP 組合樹】
  • 3205. 最優配餐【多源最短路】
  • 3215. 網絡延時【樹的直徑】
  • 3250. 通信網絡【思維 圖】
  • 3240. 壓縮編碼【區間DP】

730. 機器人跳躍問題【二分】

#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int h[N],n; bool check(long long int mid) {for(int i=1;i<=n;i++){mid=mid*2-h[i];if(mid<0) return false;if(mid>1e9) return true;}return true; } int main(void) {cin>>n;for(int i=1;i<=n;i++) cin>>h[i];int l=0,r=1e6;while(l<r){int mid=l+r>>1;if(check(mid)) r=mid;else l=mid+1;}cout<<l<<endl;return 0; }

3195. 有趣的數【DP 組合樹】

#include<bits/stdc++.h> using namespace std; const int N=1010; const int mod=1e9+7; typedef long long int LL; LL c[N][N],n; int main(void) {cin>>n;for(int i=0;i<=n;i++){for(int j=0;j<=i;j++){if(j==0) c[i][j]=1;else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;}}LL res=0;for(int k=2;k<=n-2;k++)res=(res+c[n-1][k]*(k-1)%mod*(n-k-1))%mod;cout<<res;return 0; }

3205. 最優配餐【多源最短路】

#include<bits/stdc++.h> using namespace std; const int N=1e3+10; int g[N][N],n,m,k,d; int dist[N][N]; struct node{int x,y,c;}; vector<node>ve; queue<node>q; void bfs() {int dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};while(q.size()){auto temp=q.front(); q.pop();int x=temp.x,y=temp.y;for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx<=0||tempx>n||tempy<=0||tempy>n) continue;if(g[tempx][tempy]) continue;if(dist[tempx][tempy]>dist[x][y]+1){dist[tempx][tempy]=dist[x][y]+1;q.push({tempx,tempy,0});}}} } int main(void) {memset(dist,0x3f,sizeof dist);cin>>n>>m>>k>>d;while(m--){int x,y; scanf("%d%d",&x,&y);q.push({x,y,0});dist[x][y]=0;}while(k--){int x,y,c; scanf("%d%d%d",&x,&y,&c);ve.push_back({x,y,c});}while(d--){int x,y; scanf("%d%d",&x,&y);g[x][y]=1;}bfs();long long int sum=0;for(int i=0;i<ve.size();i++) sum+=1ll*dist[ve[i].x][ve[i].y]*ve[i].c;cout<<sum<<endl;return 0; }

3215. 網絡延時【樹的直徑】

#include<bits/stdc++.h> using namespace std; const int N=1e5*2+10; int h[N],e[N],ne[N],idx; int n,m,ans=0; void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++; } int dfs(int u) {int d1=0,d2=0;//最長路 次長路for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];int d=dfs(j);if(d>=d1) d2=d1,d1=d;else if(d>d2) d2=d;}ans=max(ans,d1+d2);return d1+1; } int main(void) {memset(h,-1,sizeof h);cin>>n>>m;for(int i=2;i<=n+m;i++){int x; cin>>x;add(x,i);}dfs(1);cout<<ans;return 0; }

3250. 通信網絡【思維 圖】


如果一個點A可以到達的點有s1個,有s2個點可以到達A。且s1+s2==n則這就是一個所求的點。
故可以建立反向邊。這樣就可以逆著求那些點可以到達它

#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int h1[N],h2[N],ne[N],e[N],idx; int n,m,st1[N],st2[N]; void add(int h[],int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void dfs(int u,int h[],int st[]) {st[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j]) dfs(j,h,st);} } int main(void) {memset(h1,-1,sizeof h1);memset(h2,-1,sizeof h2);cin>>n>>m;for(int i=0;i<m;i++){int a,b; cin>>a>>b;add(h1,a,b),add(h2,b,a);}int ans=0;for(int i=1;i<=n;i++){memset(st1,0,sizeof st1);memset(st2,0,sizeof st2);dfs(i,h1,st1);dfs(i,h2,st2);int cnt=0;for(int j=1;j<=n;j++) if(st1[j]||st2[j]) cnt++;if(cnt==n) ans++;}cout<<ans;return 0; }

3240. 壓縮編碼【區間DP】


猛的一看以為是哈夫曼樹,直接合并任意倆點。但是題目要求字典序遞增。
這其實就是暗示每次合并只可以合并相鄰的點。

#include<bits/stdc++.h> using namespace std; const int N=1010; int f[N][N],n,s[N]; int main(void) {cin>>n;for(int i=1;i<=n;i++) cin>>s[i],s[i]+=s[i-1];for(int len=2;len<=n;len++){for(int i=1;i+len-1<=n;i++){int l=i,r=i+len-1;f[l][r]=1e9;for(int k=l;k<r;k++){f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);}}}cout<<f[1][n];return 0; }

總結

以上是生活随笔為你收集整理的寒假每日一题(提高组)【Week 4 完结】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。