2018/11/16 集訓隊週五第五次測試賽補題題解
阿新 • • 發佈:2018-11-19
這次基本提高組的題了。。。
A 無線網路發射器選址
這個題的資料有點水,直接兩次三個for即可。第一次三個for是找到最大值,第二次三個for是尋找個數
完整程式碼
#include <bits/stdc++.h> using namespace std; struct node { int x,y,sum; }G[100]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int d,maxn=-1,js=0; cin>>d; int n; cin>>n; for(int i=0;i<n;i++) cin>>G[i].y>>G[i].x>>G[i].sum; for(int i=0;i<=128;i++) for(int j=0;j<=128;j++) { int ans=0; for(int k=0;k<n;k++) { if(G[k].x>=i-d&&G[k].x<=i+d&&G[k].y>=j-d&&G[k].y<=j+d) ans+=G[k].sum; } maxn=max(maxn,ans); } for(int i=0;i<=128;i++) for(int j=0;j<=128;j++) { int ans=0; for(int k=0;k<n;k++) { if(G[k].x>=i-d&&G[k].x<=i+d&&G[k].y>=j-d&&G[k].y<=j+d) ans+=G[k].sum; } if(ans==maxn) js++; } cout<<js<<" "<<maxn; }
C 尋找道路
一眼看上去不是spfa的裸題嗎,實際上並不是。。。具體解釋在另一個題解中
完整程式碼
#include <bits/stdc++.h> using namespace std; struct node { int to,cost; }; map<long long,long long> vis,bk,bk1,dis,bk2; queue<int> q,qq; vector <node> G1[10005]; vector <node> G2[10005]; const int inf=INT_MAX; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,m; cin>>n>>m; while(m--) { int t1,t2; cin>>t1>>t2; G1[t2].push_back((node){t1,1}); G2[t1].push_back((node){t2,1}); } int s,e; cin>>s>>e; for(int i=1;i<=n;i++) dis[i]=i==s?0:inf; qq.push(e); bk2[e]=1; while(qq.size()) { int f=qq.front(); qq.pop(); bk[f]=1; vis[f]=1; for(int i=0;i<G1[f].size();i++) { vis[G1[f][i].to]=1; bk[G1[f][i].to]=1; if(!bk2[G1[f][i].to]) { bk2[G1[f][i].to]=1; qq.push(G1[f][i].to); } } } for(int i=1;i<=n;i++) { if(!vis[i]) for(int j=0;j<G1[i].size();j++) if(vis[G1[i][j].to]) bk[G1[i][j].to]=0; } q.push(s); while(q.size()) { int p=q.front(); q.pop(); bk1[p]=0; if(bk[p]) { for(int i=0;i<G2[p].size();i++) { if(dis[G2[p][i].to]>dis[p]+G2[p][i].cost) { dis[G2[p][i].to]=dis[p]+G2[p][i].cost; if(!bk1[G2[p][i].to]) { bk1[G2[p][i].to]=1; q.push(G2[p][i].to); } } } } } if(dis[e]<INT_MAX) cout<<dis[e]; else cout<<-1; }