ACM-ICPC实验室周赛2020.3.3

唉 发挥的不太好,总是想错想多。。。

下一周加强训练,争取冲进前十。

一定要去天梯赛。

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;
}
View Code

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);
    
}
View Code

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;
}
View Code
原文地址:https://www.cnblogs.com/zhanglichen/p/12405489.html