码迷,mamicode.com
首页 > 其他好文 > 详细

【解题报告】AtCoder Beginner Contest 166

时间:2020-05-07 00:40:07      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:ons   i+1   user   端点   href   main   variables   思路   应该   

【解题报告】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\n");
        v[p[i]]++,v[q[i]]--;
    }
    puts("Yes");
    for(int i=1;i<=n;i++) printf("%c\n",‘A‘+p[i]);
    return 0;
}

【解题报告】AtCoder Beginner Contest 166

标签:ons   i+1   user   端点   href   main   variables   思路   应该   

原文地址:https://www.cnblogs.com/nznd0819/p/12839862.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!