PS/코드포스

CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!)

꼬두람2 2022. 3. 27. 03:09

A. Good Pairs

 아래 식을 만족하려면 각 절댓값이 >=0 이면 성립한다. 따라서, ai는 배열에서 가장 큰값, aj는 가장 작은 값이면 식이 성립한다. { val, idx } 형태로 저장해 오름차순으로 정렬해서 인덱스를 구해주었다.

 |aiak|+|akaj|=|aiaj|

#include <bits/stdc++.h>
 
using namespace std;
using ll = long long;
 
int tc;
int n, a, b;
 
int main(void) {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> tc;
	while(tc--) {
		cin >> n;
		vector<pair<int, int>>v;
		for(int i = 0; i < n; i++) {
			cin >> a;
			v.push_back({ a, i });
		}
		sort(v.begin(), v.end());
		cout << v[n-1].second + 1 << ' ' << v[0].second + 1<< '\n';
	}
}

 

B. Subtract Operation

 종이에 써가면 구하다 보니 앞에서 뺀 것이 나중에 다시 빼져 소거되는 규칙을 발견했다. 믿음을 가지고 풀었다. 배열에서 두 원소를 뺐을 때 k가 되는 경우가 있으면 "YES", 없으면 "NO".

#include <bits/stdc++.h>
 
using namespace std;
using ll = long long;
 
int tc;
int n, a, b, k;
 
int main(void) {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> tc;
	while(tc--) {
		cin >> n >> k;
		vector<int>v;
		for(int i = 0; i < n; i++) {
			cin >> a;
			v.push_back(a);
		}
		sort(v.begin(), v.end());
		bool possible = 0;
		for(int i = 0; i < n; i++) {
			int idx = lower_bound(v.begin(), v.end(), k+v[i]) - v.begin();
			if(idx < n && v[idx] == k+v[i]) {
				possible = 1;
			}
		}
		if(possible) cout << "YES\n";
		else cout << "NO" << '\n';
	}
}

 

 

C. Make Equal With Mod

 Mod 연산으로 우리는 0이나 1을 쉽게 만들 수 있다. 그래서 0과 1을 기준으로 생각을 했다. 기본적으로 Mod 연산을 통해 0으로 만드는 것은 당연하다. 하지만 배열에 1이 이미 있는 경우에는 예외 처리를 해주어야 한다. 나머지를 모두 1로 만들어 주기 위해서는 %(원소 값 - 1) 을 해주어야 한다. 하지만 이 연산을 할 때 (원소 값 - 1)이 배열에 이미 있으면 이 값은 Mod 연산 후에는 0이 되버리기 때문에 No를 출력해야 한다. 배열에 1이 있는 경우에는 배열에 연속한 원소가 없으면 모든 값을 1로 만들 수 있다.

#include <bits/stdc++.h>
 
using namespace std;
using ll = long long;
 
int tc;
int n, a, b, k;
 
int main(void) {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> tc;
	while(tc--) {
		cin >> n;
		vector<int>v;
		bool zero_chk = 0;
		bool one_chk = 0;
		for(int i = 0; i < n; i++) {
			cin >> a;
			if(a == 1) {
				one_chk = 1;
				continue;
			}
			if(a == 0) {
				zero_chk =  1;
				continue;
			}
			v.push_back(a);
		}
		sort(v.begin(), v.end());
		if(zero_chk && one_chk) {
			cout << "NO\n";
			continue;
		}
		else if(!zero_chk && !one_chk) {
			cout << "YES\n";
			continue;
		}
		else if(zero_chk && !one_chk) {
			cout << "YES\n";
			continue;
		}
		else {
			bool possible= 1;
			if(v.size()) {
				if(v[0] == 2) possible = 0;
			}
			for(int i = 1; i < v.size(); i++) {
				if(v[i] - v[i-1] == 1) {
					possible = 0;
				}
			}
			if(possible) cout << "YES\n";
			else cout << "NO\n";
		}
	}
}

   

'PS > 코드포스' 카테고리의 다른 글

Educational Codeforces Round 123 (Rated for Div. 2)  (1) 2022.02.23