解题报告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 解题报告