AtCoder ABC371 A-D题解
省流:赛场上不会 C。
比赛链接:ABC371
Problem A:
Sol
if 暴力判断即可。
Code
#include <bits/stdc++.h>
using namespace std;
int main(){char SAB,SAC,SBC;cin>>SAB>>SAC>>SBC;if(SAB=='>' && SBC=='>')cout<<"b"<<endl;else if(SAB=='>' && SBC=='<' && SAC=='>')cout<<"c"<<endl;else if(SAB=='>' && SBC=='<' && SAC=='<')cout<<"a"<<endl;else if(SAB=='<' && SBC=='<')cout<<"b"<<endl;else if(SAB=='<' && SBC=='>' && SAC=='<')cout<<"c"<<endl;else if(SAB=='<' && SBC=='>' && SAC=='>')cout<<"a"<<endl;return 0;
}
Problem B:
Sol
简单哪一个数组记录即可。
Code
#include <bits/stdc++.h>
using namespace std;
bool have[105];
int main(){int N,M;cin>>N>>M;for(int i=1;i<=M;i++){int A;char B;cin>>A>>B;if(B=='M' && !have[A]){cout<<"yes"<<endl;have[A]=true;}elsecout<<"no"<<endl;}return 0;
}
Problem D:
Sol
首先对村庄的位置离散化,用数组记录。然后用统计前缀和。然后在数组上二分和后求前缀和即可。
Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=200005;
struct village{int X;int P;
}country[maxn];
int loc[maxn],sum[maxn];
bool cmp(village a,village b){return a.X<b.X;
}
signed main(){int N;cin>>N;for(int i=1;i<=N;i++)cin>>country[i].X;for(int i=1;i<=N;i++)cin>>country[i].P;sort(country+1,country+N+1,cmp);for(int i=1;i<=N;i++){loc[i]=country[i].X;sum[i]=country[i].P+sum[i-1];cout<<sum[i]<<' ';}int Q;cin>>Q;while(Q--){int L,R;cin>>L>>R;int l=lower_bound(loc+1,loc+N+1,L)-loc;int r=upper_bound(loc+1,loc+N+1,R)-loc-1;if(l>r || (l==N+1 && r==N+1)){cout<<0<<endl;continue;}if(l==N+1)l=N;if(r==N+1)r=N;cout<<sum[r]-sum[l-1]<<endl;}return 0;
}
Problem C:
Sol
注意到本题,可以全排列枚举所有情况,取最小值。时间复杂度 。
Code
#include <bits/stdc++.h>
using namespace std;
const int maxn=105;
const int INF=0x3f3f3f3f;
int N,MG,MH,u1[maxn],a1[maxn],v1[maxn],b1[maxn],A[maxn][maxn];
int h[maxn][maxn],g[maxn][maxn],mark[maxn],ans=INF;
void dfs(int pos){if(pos>N){for(int i=1;i<=MG;i++)h[mark[u1[i]]][mark[v1[i]]]=h[mark[v1[i]]][mark[u1[i]]]=1;int sum=0;for(int i=1;i<N;i++){for(int j=i+1;j<=N;j++){if(h[i][j]==g[i][j])continue;sum+=A[i][j];}}ans=min(ans,sum);memset(h,0,sizeof(h));return;}for(int i=1;i<=N;i++){if(!mark[i]){mark[i]=pos;dfs(pos+1);mark[i]=0;}}
}
int main(){cin>>N;cin>>MG;for(int i=1;i<=MG;i++)cin>>u1[i]>>v1[i];cin>>MH;for(int i=1;i<=MH;i++){cin>>a1[i]>>b1[i];g[a1[i]][b1[i]]=g[b1[i]][a1[i]]=1;}for(int i=1;i<N;i++){for(int j=i+1;j<=N;j++){cin>>A[i][j];A[j][i]=A[i][j];}}dfs(1);cout<<ans<<endl;return 0;
}