반응형
https://www.acmicpc.net/problem/1024
오답 풀이
예제에 대해서 하나씩 계산을 해보았다.
우선, N에 예제 출력의 수열 길이를 나누었다.
그러자 규칙을 발견했다.
규칙은 다음과 같았다.
주어진 수를 N, 출력이 될 수열의 길이가 L이라고 했을 때,
다음 중 하나를 만족하면 답이 있다.
- L이 짝수이며 N에 L을 나누었을 때 나머지가 0.5이다.
- L이 홀수이며 N에 L을 나누었을 떄 나누어 떨어진다.
출력이 될 수열에서 첫 번째 값은 다음처럼 계산했다.
- L이 짝수라면 N에 L을 나눈 몫에 L에 2를 나눈 몫을 빼고 1을 더한다.
- L이 홀수라면 N에 L을 나눈 몫이 L에 2를 나눈 몫을 뺀다.
이렇게 작성한 코드가 다음과 같다.
더보기
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, N) for(int i = 0; i < N; ++i)
#define TC(T) int T; cin >> T; while(T--)
#define FAST_IO cin.tie(NULL); ios::sync_with_stdio(false);
#define ERR 1e-13
#define EL "\n"
#define VI vector<int>
#define VVI vector<VI>
#define VVVI vector<VVI>
#define VP vector<pair<int, int>>
#define VVP vector<VP>
#define VC vector<char>
#define VVC vector<VC>
#define VB vector<bool>
#define VVB vector<VB>
#define VVVB vector<VVB>
int main() {
#ifdef DEBUG
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
FAST_IO;
int N, L;
cin >> N >> L;
VI ans;
double quotient = N;
while (quotient >= L) {
// 주어진 수에 나누려고 하는 개수를 나누어 몫을 구합니다.
quotient = (double)N / L;
// 짝수개로 나누려고 하며, 몫의 소수점이 0.5입니다.
bool condition1 = L % 2 == 0 && quotient - (int)quotient / 1 == 0.5;
// 홀수개로 나누려고 하며, 몫이 나누어 떨어집니다.
bool condition2 = L % 2 == 1 && quotient - (int)quotient / 1 == 0;
// 위 두 조건 중 하나를 만족하면 해당하는 수열이 있습니다.
if (condition1 || condition2) {
int startNumber = (N / L) - (L / 2) + (L % 2 == 1 ? 0 : 1);
for (int i = 0; i < L; i++) {
ans.push_back(startNumber + i);
}
break;
}
// 나누는 개수를 늘려줍니다.
L++;
}
int ans_size = ans.size();
if (ans_size == 0) {
cout << -1 << EL;
} else {
for (auto& el : ans)
cout << el << ' ';
cout << EL;
}
return 0;
}
그리고 결과는
아래 블로그의 첫 번째 풀이와 동일하나 왜 틀렸는지는 알 수 없었다.
https://sexycoder.tistory.com/97
반응형
'프로그래밍 > PS' 카테고리의 다른 글
[C++] 백준 13460번: 구슬 탈출 2 (0) | 2022.02.18 |
---|---|
[C++] 백준 13305번: 주유소 (0) | 2022.01.26 |
[C++] 백준 1912번: 연속합 (0) | 2022.01.24 |
[C++] 백준 2143번: 두 배열의 합 (0) | 2021.09.14 |
[C++] 백준 1644번: 소수의 연속합 (0) | 2021.09.12 |