🔵
【ABC398】AtCoder Beginner Contest 398【C++】
コンテスト名
ユニークビジョンプログラミングコンテスト2025 春(AtCoder Beginner Contest 398)
コンテストURL
開催日
2025/03/22 21:00-22:40
A: Doors in the Center
解法
- 回文の中央は
=
-
の偶奇で場合分けする
ABC398A.cpp
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
if(n%2==0){
for(int i=0; i<n/2-1; i++){
cout << '-';
}
cout << "==";
for(int i=0; i<n/2-1; i++){
cout << '-';
}
}else{
for(int i=0; i<n/2; i++){
cout << '-';
}
cout << '=';
for(int i=0; i<n/2; i++){
cout << '-';
}
}
cout << endl;
return 0;
}
B: Full House 3
解法
- 各種類の枚数を
vector<int>
に記録する - 3枚以上ある種類が一つ見つかれば、次は2枚以上ある種類を見つければよいことに注意する
ABC398B.cpp
#include <iostream>
#include <vector>
using namespace std;
int main(){
int a;
vector<int> V(13);
for(int i=0; i<7; i++){
cin >> a;
a--;
V[a]++;
}
bool flag3 = false, flag2 = false;
for(int i=0; i<13; i++){
if(!flag3 && V[i]>=3){
flag3 = true;
}else if(V[i]>=2){
flag2 = true;
}
}
if(flag3 && flag2){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
return 0;
}
C: Uniqueness
解法
-
map<int, int>
で各数を持っている人数を記録する
ABC398C.cpp
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> A(n);
map<int, int> M;
for(int i=0; i<n; i++){
cin >> A[i];
M[A[i]]++;
}
int maxv = 0, maxid = -1;
for(int i=0; i<n; i++){
if(M[A[i]]==1 && maxv<A[i]){
maxv = A[i];
maxid = i + 1;
}
}
cout << maxid << endl;
return 0;
}
D: Bonfire
解法
- 焚き火と高橋君が風と逆向きに移動すると考える
-
set<pair<int, int>>
に焚き火の位置を記録する
ABC398D.cpp
#include <iostream>
#include <string>
#include <set>
using namespace std;
int main(){
int n, r, c;
cin >> n >> r >> c;
string s;
cin >> s;
set<pair<int, int>> S;
int x = 0, y = 0;
S.emplace(x, y);
for(int i=0; i<n; i++){
if(s[i]=='N'){
x++;
S.emplace(x, y);
r++;
}else if(s[i]=='W'){
y++;
S.emplace(x, y);
c++;
}else if(s[i]=='S'){
x--;
S.emplace(x, y);
r--;
}else if(s[i]=='E'){
y--;
S.emplace(x, y);
c--;
}
if(S.count({r, c})){
cout << 1;
}else{
cout << 0;
}
}
cout << endl;
return 0;
}
Discussion