
Codeforces Round #750 (Div. 2)-D. Vupsen, Pupsen and 0
falconlee236
·2021. 12. 13. 19:29
문제 설명
카파와 수아는 정수 배열을 선물받았다. 카파는 숫자
수아는 반대로 숫자
Input
첫번째 줄에는 테스트 케이스의 개수를 나타내는 정수
각 테스트케이스의 첫번째 줄에는 배열의 길이
각 테스트케이스의 두번째 줄에는 배열
Output
각 테스트 케이스마다 원소
Example
input
3
2
5 5
5
5 -2 10 -9 4
7
1 2 3 4 5 6 7
output
1 -1
-1 5 1 -1 -1
-10 2 2 -3 5 -1 -1
문제 접근
사용한 알고리즘: 수학, 구성적
걸린 시간 : 00:10
C번에서 너무 시간을 끌어서 이 문제를 깊이있게 생각 할 수 가 없었던 것 같다. C번을 버리고 바로 이 문제를 1시간 반동안 생각했으면 풀었을 수도 있을 것 같다. 이 문제는 구성적 알고리즘을 사용하는 전형적인 문제인 것 같고 몇가지 테스트 케이스를 직접 만들어서 생각해보면 규칙성이 보인다.
먼저 배열의 길이가 짝수인 경우 쉽게 풀 수 있다. 만약 배열
그렇다면 배열의 길이가 홀수인 경우 어떻게 풀까? 일단 배열에서 맨 앞에 있는 원소 3개를 빼면 뒤에 남아있는 배열은 짝수 길이 배열이기 때문에 위에서 언급한 배열의 길이가 짝수인 경우 배열을 구성하는 방법을 통해서 쉽게 구할 수 있다. 그러면 남아있는 숫자 3개로 어떻게 0을 만들 수 있을까? 배열
맨 마지막에 있는 조건은 무조건 맞출 수 있을까? 일단 모든 원소가
배열의 길이가
그러면 나머지 3개의 원소는 어떻게 될까? 해는 각각
정답 코드
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--){
int n; cin >> n;
int a[n];
for(int& i : a) cin >> i;
if(n & 1){
if(a[0] + a[1]) cout << -a[2] << " " << -a[2] << " " << a[0] + a[1] << " ";
else if(a[1] + a[2]) cout << a[1] + a[2] << " " << -a[0] << " " << -a[0] << " ";
else cout << -a[1] << " " << a[0] + a[2] << " " << -a[1] << " ";
for(int i = 3; i < n; i+=2) cout << a[i + 1] << " " << -a[i] << " ";
}else{
for(int i = 0; i < n; i+=2) cout << a[i + 1] << " " << -a[i] << " ";
}
cout << "\n";
}
return 0;
}
'알고리즘 > codeforces' 카테고리의 다른 글
Educational Codeforces Round 116 - B. Update Files (0) | 2021.12.17 |
---|---|
Educational Codeforces Round 116 - A. AB Balance (0) | 2021.12.17 |
Codeforces Round #750 (Div. 2)-C. Grandma Capa Knits a Scarf (0) | 2021.11.28 |
Codeforces Round #750 (Div. 2)-B. Luntik and Subsequences (0) | 2021.11.28 |
Codeforces Round #750 (Div. 2)-A. Luntik and Concerts (0) | 2021.11.28 |