Programming

[CF] Round #669 (Div. 2) _ 200908

minigb 2021. 4. 13. 01:39

(2020년 9월 10일에 작성한 글입니다.)

 

 

Dashboard - Codeforces Round #669 (Div. 2) - Codeforces

 

codeforces.com

 

A.

코포 스타일의 문제에 빨리 익숙해져야 할 것 같다. 그러려면 문제를 많이 풀어봐야 되겠지.

A에서 시간을 많이 쓰는 걸 해결해야 할 듯.

0이랑 1만 등장하기 때문에

만약 전체에서 0의 개수가 더 많으면, 그냥 그 개수만큼 0을 출력하고

1이 더 많으면 1을 짝수개만 남겨두고 출력하면 된다.

짝수개를 남겨두는 방법은,

현재 1의 개수가 짝수면 그대로 남겨두고, 홀수면 1개를 없애고.

이때 1개를 없앨 때, 남아있는 1의 개수가 K/2 이상이어야 하는데

무조건 그렇게 된다. 왜냐하면 1이 0보다 많은 상태이고

그럼 최소 K/2+1이기 때문.

이걸 한참 돌아가서 30분동안 풀었어... 몇 번이나 틀리고.

이렇게... 코포 A에서는

괜히 예제를 복잡하게 만들어서 되게 복잡한 문제처럼 보이게 하는데

알고보면 진짜 단순하게 출력하면 되는.. 그런 문제가 많다.

여기에 익숙해져야 할 듯.

A에서부터 시간을 줄이는 연습을 해야겠다.

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int T;
	int N;
	int i;
	int temp;

	cin >> T;
	while (T--) {
		cin >> N;
		vector<int> arr(N);
		vector<int> sum(2);

		pair<int, int> cur;
		for (i = 0; i < N; i++) {
			cin >> temp;
			arr[i] = temp;
			sum[temp]++;
		}
		
		if (sum[0] >= sum[1]) {
			cout << sum[0] << '\n';
			for (i = 0; i < sum[0]; i++) {
				cout << 0 << ' ';
			}
			cout << '\n';
		}
		else {
			if (sum[1] % 2) {
				sum[1]--;
			}
			cout << sum[1] << '\n';
			for (i = 0; i < sum[1]; i++) {
				cout << 1 << ' ';
			}
			cout << '\n';
		}
	}

	return 0;
}

 

B.

갖고 있던 최대공약수 구하는 코드 이용해서 금방 풀었다.

일단 무조건 가장 큰 값이 맨 앞에 와야 하고

그 뒤로는 GCD 계속 구해가면서 GCD가 가장 큰 걸 그 뒤에 넣고

그리고 GCD가 1이 되면 나머지는 순서가 상관 없게 됨.

int gcd(int k, int l)
{
	return l ? gcd(l, k % l) : k;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int T;
	int N;
	int cur_num, cur_gcd;
	int gcd_;
	int max_, max_i;
	int i;

	cin >> T;
	while (T--) {
		cin >> N;
		vector<int> arr(N);
		for (i = 0; i < N; i++) {
			cin >> arr[i];
		}
		sort(arr.begin(), arr.end(), greater<int>());

		vector<bool> used(N);
		used[0] = true;
		cout << arr[0] << ' ';

		cur_num = cur_gcd = arr[0];
		for (int cnt = 1; cnt < N; cnt++) {
			max_ = 0;
			for (i = 1; i < N; i++) {
				if (!used[i]) {
					gcd_ = gcd(cur_gcd, arr[i]);
					if (max_ < gcd_) {
						max_ = gcd_;
						max_i = i;
					}
				}
			}
			used[max_i] = true;
			cur_num = arr[max_i];
			cur_gcd = max_;
			cout << cur_num << ' ';

			if (cur_gcd == 1 && cnt != N - 1) {
				for (i = 0; i < N; i++) {
					if (!used[i]) {
						cout << arr[i] << ' ';
					}
				}
				break;
			}
		}

		cout << '\n';
	}

	return 0;
}