唉 发挥的不太好,总是想错想多。。。
下一周加强训练,争取冲进前十。
一定要去天梯赛。
A
判断一个大数是否能被13整除。
#include<bits/stdc++.h> using namespace std; string s; long long a[100014]; int main () { cin>>s; int len=s.length(); int flag=0; for (int i=0;i<s.length();i++) a[i]=s[i]-'0'; for (int i=0;i<s.length()-1;i++) if (abs(a[i]-a[i+1])>3) flag=1; for (len;len>=1;len--) { a[len]%=13; a[len-1]+=(long long)a[len]*4; } if (a[0]%13==0&&!flag) printf ("Yes"); else printf ("No"); return 0; }
B
给出开始排名和结束排名,问有多少人把原本排在自己前面的人超过了。
#include<bits/stdc++.h> using namespace std; const int maxn=100014; int a[maxn],b[maxn]; int a1[maxn],b1[maxn]; int N; int main () { scanf("%d",&N); int x; for (int i=1;i<=N;i++) scanf("%d",&x),a[x]=i,a1[i]=x; for (int i=1;i<=N;i++) scanf("%d",&x),b[x]=i,b1[i]=x; int ans=0; for (int i=1;i<=N;i++) { if (b[i]<a[i]) { ans++; continue; } if (b[i]>=a[i]) { int flag=0; for (int j=b[i]+1;j<=N;j++) if (a[b1[j]]<a[i]) { flag=1;break; } if (flag) ans++; } } printf ("%d",ans); }
C
给出一颗树,和三个点,要求输出必须经过三个点的最短路径长度。
#include<bits/stdc++.h> using namespace std; const int maxn=1014; const int inf=1e9; vector<int> g[maxn]; int visit[maxn]; int d[maxn][maxn]; int N; void bfs (int s) { fill(visit,visit+maxn,0); visit[s]=1; d[s][s]=0; queue<int> q; q.push(s); while (!q.empty()) { int u=q.front(); q.pop(); for (int i=0;i<g[u].size();i++) { int v=g[u][i]; if (visit[v]) continue; d[s][v]=d[s][u]+1; q.push(v); visit[v]=1; } } } int main () { scanf("%d",&N); int x,y; for (int i=1;i<=N-1;i++) { scanf("%d%d",&x,&y); g[x].push_back(y); g[y].push_back(x); } int a,b,c; int M; scanf("%d",&M); for (int i=1;i<=N;i++) bfs(i); for (int i=0;i<M;i++) { scanf("%d%d%d",&a,&b,&c); int x=min(d[a][b]+d[b][c],min(d[a][b]+d[a][c],d[a][c]+d[b][c])); printf ("%d ",x); } return 0; }