解题报告AtCoder Beginner Contest 166

Posted nznd0819

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解题报告AtCoder Beginner Contest 166相关的知识,希望对你有一定的参考价值。

【解题报告】AtCoder Beginner Contest 166

A - A?C

题意

输入ABC则输出ARC,输入ARC则输出ABC

B - Trick or Treat

题意

给定(n,k), 接下来(k)组数据, 每组数据第一行一个数(k_i)表示接下来的一行包含(k_i)(1)(n)的数, 统计(1)(n)之间从未出现的数的个数

C - Peaks

题意

有n个天文台, 高度为h, m条路径, 统计符合以下条件的天文台数量: 与该天文台有直接相连的路径的天文台高度均低于它.

思路

对于一条路径两端的两个天文台, 其中高度较低的一定不需要统计, 故对每条路径排除掉较低的端点, 注意高度相等时两个端点都应该排除

AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int N=100010;
int h[N];
bool flag[N];

int main(){
    int n,m;cin >> n >> m;
    for(int i=1;i<=n;i++)cin >> h[i];
    while(m--){
        int a,b ;cin >> a >> b;
        if(h[a]==h[b])flag[a]=flag[b]=1;
        flag[h[a]>h[b]?b:a]=1;
    }
    int ans=0;
    for(int i=1;i<=n;i++)if(!flag[i])ans++;
    cout << ans << endl;
    return 0;
}

D - I hate Factorization

题意

已知(X), 求一组(A,B) 满足(A^5-B^5=X), 解一定存在

思路

易知, 当(|A|)越大,(|A-B|)会接近(1), 注意到(X<10^9),有(-300<A,B<300), 因此枚举即可

AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;

int main(){
    ll x;cin >> x;
    for(int i=-300;i<=300;i++)
        for(int j=-300;j<=300;j++){
            ll m=i*i,n=j*j;
            if(m*m*i-n*n*j==x){
                cout << i << " " << j << endl;
                return 0;
            }
        }
    return 0;
}

E - This Message Will Self-Destruct in 5s

题意

给定数组(A_i), 求满足(|i-j|=A_i+A_j)的数对个数

思路

(j>i), 等式变成(j-A_j=A_i+i), 统计(j-A_j)个数, 依次加上(A_i+i)的个数即可, 由于要满足(j>i), 每次需减少一个(i-A_i)

AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int N=200020;
int a[N];

int main(){
    int n;cin >> n;
    map<int,int> mp;
    for(int i=1;i<=n;i++){
        cin >> a[i];
        mp[i-a[i]]++;
    }
    ll ans=0;
    for(int i=1;i<=n;i++){
        mp[i-a[i]]--;
        ans+=mp[i+a[i]];
    }
    cout << ans << endl;
    return 0;
}

F - Three Variables Game

题意

给定三个数(A,B,C),有三种操作:

  • AB: AB 其中一个加一另一个减一
  • BC:BC 其中一个加一另一个减一
  • AC:AC 其中一个加一另一个减一

问能否在保证三个数都非负的条件下进行(n)次操作,如果可以输出每次操作加一的那个

参考源

代码地址: https://atcoder.jp/contests/abc166/submissions/12816649

作者: jintiandun

思路

模拟: 优先较小的数加一,如果两数相等,优先下一步要用的数加一

AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int N=100020;
int v[3],p[N],q[N];
int main(){
    int n;cin >> n;
    string s;
    for(int i=0;i<3;i++)cin >> v[i];
    for(int i=1;i<=n;i++){
        cin >> s;
        p[i]=s[0]-‘A‘;
        q[i]=s[1]-‘A‘;
    }
    for(int i=1;i<=n;i++){
        if(v[p[i]]>v[q[i]])swap(p[i],q[i]);
        else if(v[p[i]]==v[q[i]])
            if(i<n&&(q[i]==q[i+1]||q[i]==p[i+1]))swap(p[i],q[i]);
        if(!v[q[i]])return 0*printf("No
");
        v[p[i]]++,v[q[i]]--;
    }
    puts("Yes");
    for(int i=1;i<=n;i++) printf("%c
",‘A‘+p[i]);
    return 0;
}

以上是关于解题报告AtCoder Beginner Contest 166的主要内容,如果未能解决你的问题,请参考以下文章

解题报告AtCoder Beginner Contest 166

解题报告AtCoder Beginner Contest 166

AtCoder Beginner Contest 125 解题报告

AtCoder Beginner Contest 129 解题报告

AtCoder Beginner Contest 117 解题报告

Atcoder Beginner Contest 124 解题报告