Code Forces
Codeforces Round #616 (Div. 2) 첫 코포
jh280722
2020. 4. 1. 17:41
2020년 2월 3일 처음으로 코드 포스를 도전하게 되었다. 일단 너무 생소했다. 그래도 백준에서 문제를 조금 풀어보면서 조금 익숙해진 줄 알았는데 지금까지 풀었던 유형이랑 많이 달랐다. 또 평소 영어를 못하는데 영어가 나와서 해석하는 것만으로도 시간을 너무 많이 사용했다. 해석이 끝나도 멍했던 거 같다. 그래서 1시간 43분에 겨우 A번을 풀고 그렇게 첫 코포를 마치게 되었다.
A- Even But Not Even
더보기
소스코드
#include <iostream>
#include <vector>
#include <algorithm>
#define INF 1000000000
typedef long long ll;
using namespace std;
//sum이 2로 나눌수 있고 자체 넘버는 2로 안 나눠진다. ebne이다.
//앞에 0이 올 수 없고 숫자를 삭제할 수 도 있다. 순서는 변경 금지
//0~n-1의 수를 삭제가능
int n, m, t;
bool flag = false;
int sum(string num) {
int s = 0;
for (int i = 0; i < num.size(); i++) {
if (num[i] == 0)
break;
s += num[i] - '0';
}
return s;
}
bool check(int num, int numend) {
if (num % 2 == 0 && numend % 2 == 1)
return true;
return false;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> t;
while (t--) {
flag = false;
string num;
cin >> n;
cin >> num;
int totalsum;
int circle = n;
while (circle--) {
totalsum = sum(num);
if (check(totalsum, num[circle] - '0')) {
for (int i = 0; i < n; i++) {
if (num[i] == 0)
break;
cout << num[i];
}
cout << '\n';
flag = true;
break;
}
else {
bool flag2 = false;
for (int i = circle; i >= 0; i--) {
int tmp = (totalsum - (num[i] - '0'));
if (tmp % 2 == 0) {
if (i == 0 && num[1] == '0')
continue;
for (int j = i; j < n; j++) {
num[j] = num[j + 1];
}
totalsum -= tmp;
flag2 = true;
break;
}
}
if (!flag2) {
if ((num[circle] - '0') % 2 == 0) {
totalsum -= num[circle] - '0';
num[circle] = 0;
}
else {
totalsum -= num[circle-1] - '0';
num[circle-1] = num[circle];
num[circle] = 0;
}
}
}
}
if (!flag)
cout << -1 << '\n';
}
return 0;
}
어떻게든 풀어서 맞은 코드이다. A는 홀수이면서 전체 합이 짝수인 숫자가 되도록 숫자를 마음대로 제거해서 결과값을 출력하는 문제였다. 제거하는 횟수가 최소나 최대가 될 필요가 없기에 그냥 홀수 두 개만 뽑아서 출력하면 된다. 그런데 이때는 그냥 구현으로 다해 보면서 했던 것 같다. 코드가 너무 더러워서 지금 다시 풀어봤다.
더보기
소스코드
#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
#define pb push_back
#define fu(i,a,j) for(int i=a;i<j;i++)
#define fd(i,a,j) for(int i=a;i>=j;i--)
#define SYNC ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
#define MOD 998244353
#define MOD2 1000000021
#define INF 1e9
#define N 100001
using namespace std;
typedef long long ll;
typedef long double ld;
typedef double db;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a * b / gcd(a, b); };
int n, m, k, t;
int dr[] = { 0,0,1,-1, -1,1,1,-1 };
int dc[] = { -1,1,0,0, 1,1,-1,-1 };
int main() {
SYNC;
cin >> t;
while (t--) {
cin >> n;
string s;
cin >> s;
string ans;
int odd = 0;
fu(i, 0, n) {
if ((s[i] - '0') % 2 == 1) {
odd++;
ans += s[i];
}
if (odd == 2) break;
}
if (odd != 2) {
cout << -1 << '\n';
continue;
}
cout << ans << '\n';
}
return 0;
}
B. Array Sharpening
B문제는 이때는 풀지않았지만 끝나고 나중에 풀게 되었다. B에서는 strictly increasing or strictly decreasing array is sharpened 인 배열이 a= a-1 연산을 마음대로 사용해서 만들 수 있는지를 출력하는 문제였다.
증가하거나 감소하는 배열이 되기위해선 마이너스 연산을 할 수 있으므로 증가할 때는 값이 인덱스보다 크거나 같으면 되고 감소할 때는 값이 n-1-인덱스 보다 크거나 같으면 된다. 그래서 앞 뒤로 최대까지 가능한 인덱스를 구해 비교하여 출력하면 된다.
더보기
#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
#define pb push_back
#define fu(i,a,j) for(int i=a;i<j;i++)
#define fd(i,a,j) for(int i=a;i>=j;i--)
#define SYNC ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
#define MOD 998244353
#define MOD2 1000000021
#define INF 1e9
#define N 100001
using namespace std;
typedef long long ll;
typedef long double ld;
typedef double db;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a * b / gcd(a, b); };
int n, m, k, t;
int dr[] = { 0,0,1,-1, -1,1,1,-1 };
int dc[] = { -1,1,0,0, 1,1,-1,-1 };
int main() {
SYNC;
cin >> t;
while (t--) {
cin >> n;
vi a(n);
fu(i, 0, n)
cin >> a[i];
bool flg = 0;
int pre = 0, suf = n - 1;
while (pre < n && a[pre] >= pre) pre++;
while (suf >= 0 && a[suf] >= n - suf - 1) suf--;
if (suf + 1 <= pre - 1)
cout << "Yes\n";
else
cout << "No\n";
}
return 0;
}