PS/Codeforces

Educational Codeforces Round 119 (Rated for Div. 2)

dong_gas 2021. 12. 19. 03:54

종강 기념 코드포스를 했다. 뭐 사실 아직 1과목 남아있지만 암튼 종강이다.

오늘은 학교를 다녀와서 피곤했는데, 얼른 민트색을 달고 싶어서 집에 오자마자 간단히 야식을 먹고 바로 코포에 참가하였다.

 

 

오늘은 나 치고는 매우 빠르게 2솔에 성공하였다. 아마 코포 시작 후 최단기록인 듯? 이때 페널티도 없어서 그런지 꽤나 높은 퍼포먼스가 나왔다. 친구창에 있는 고수 선배님들이랑 비슷한 페이스로 2솔을 했기 때문에 기분이 너무 좋았다. 그래서 오늘 뭔가 되는 날이라고 생각했지만 어림도 없었다. 남은 100분 동안 C를 보았지만 결국 풀지 못하고 끝났다.

 

 

 

A.

N의 개수를 세어보자.

 

(1) N이 1개도 없는 경우

EEEEEEEEEEE와 같은 경우이다. 모두 같은 수이므로 가능하다

 

(2) N이 2개 이상 있는 경우

ENENNE와 같은 경우이다. N이 2개 이상 있으면 N이 나올때마다 다른 숫자로 변경한다. 마지막 N에서는 맨 처음 숫자로 변경하면 된다. 위 예제에서 122341과 같은 경우를 생각하면 된다.

 

(3) N이 1개인 경우

EENEEEE와 같은 경우이다. 처음과 끝이 절대 같을 수 없다.

 

더보기
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;
 
string s;
 
void solve() {
	cin >> s;
	ll cnt = 0;
	for (ll i = 0; i < s.size(); i++) {
		if (s[i] == 'N') cnt++;
	}
	if (cnt > 1 || cnt == 0) cout << "YES" << endl;
	else cout << "NO" << endl;
}
 
int main() {
	ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
 
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif
 
	int tc = 1; cin >> tc;
	while (tc--) {
		solve();
	}
 
	return 0;
}

 

 

 

 

B.

사각형의 모서리 위에 있는 점들이 주어진다. 4개의 모서리 중 한 모서리를 선택하여 2개의 점을 선택한다. 그리고 맞은편 모서리의 한 점을 선택한다. 선택한 3점을 이은 삼각형의 넓이를 구한다. 넓이가 최대가 되는 삼각형의 넓이에 2를 곱한 것이 답이다.

두 점을 각 모서리의 양 끝에 가장 가까운 점으로 선택하면 끝.

 

풀이가 쉬워서 얼른 짜려고 하다보니 코드가 좀 더러워진 것 같다.

더보기
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;

ll w, h;
ll a, b, c, d;
ll x;
ll ans;

void solve() {
	cin >> w >> h;
	cin >> a;
	ll minia = 0, maxia = 0;
	for (ll i = 0; i < a; i++) {
		cin >> x;
		if (i == 0) minia = x;
		if (i == a - 1) maxia = x;
	}
	cin >> b;
	ll minib = 0, maxib = 0;
	for (ll i = 0; i < b; i++) {
		cin >> x;
		if (i == 0) minib = x;
		if (i == b - 1) maxib = x;
	}
	ll tmp1 = max(maxib - minib, maxia - minia);

	cin >> c;
	ll minic = 0, maxic = 0;
	for (ll i = 0; i < c; i++) {
		cin >> x;
		if (i == 0) minic = x;
		if (i == c - 1) maxic = x;
	}
	cin >> d;
	ll minid = 0, maxid = 0;
	for (ll i = 0; i < d; i++) {
		cin >> x;
		if (i == 0) minid = x;
		if (i == d - 1) maxid = x;
	}
	ll tmp2 = max(maxid - minid, maxic - minic);
	ans = max({ tmp1 * h, tmp2 * w });
	cout << ans << endl;
}

int main() {
	ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif

	int tc = 1; cin >> tc;
	while (tc--) {
		solve();
	}

	return 0;
}

 

 

 

 

C.

각 *이 연속되는 구간 마다 연속되는 *의 개수를 미리 찾아주었다. 그리고는 x번째 이진수를 찾는 느낌으로 x번째 문자열을 찾아주면 된다. 노트에 열심히 써가면서 규칙을 찾았다. 여기까지 한 10분 정도 걸렸다.

 

남은 시간은 열심히 구현했는데, 결국 실패했다. 풀이도 지금 생각해보면 오버플로우 날 것 같다. 내 풀이는 누적곱을 구해야 했다.

 

 

 

오늘도 열일하는 웰노운 판독기

 

몰라서 못풀었다. 즉, 다음엔 풀 수 있다는 뜻! 열심히 공부하자. 참고로 저 글은 https://blog.naver.com/kks227/220793134705 여기서 확인할 수 있다. 내일 공부할 듯.

 

 


 

이번에는 아쉽게도 한 8점이 모자라서 민트에 못 갔다. 저번 라운드 때 지각등록 안 했다면 민트였을지도? 암튼 민트 퍼포 나왔으니 괜찮다. 점수가 오르는 재미가 있다. 아주 야무지다. 그리고 고수들이 주위에 있어서 뭐가 부족한지 바로 알 수 있어서 참 좋다. ㄱㅇㄷ

 

아, 신촌 연합 알고리즘 캠프도 신청했다. 욕심을 내서 초급반과 중급반 모두 신청했다. 방학 때 개열심히 해보려고 한다. 아무도 날 막지 못한다.

 

 

오늘 학교에 오리가 많았다 ㅋㅋ