1. 반복문 이용해서 풀이하는 것. 2. 인덱스는 어떻게 처리할 것인가. 3. 순서만 꼼꼼하게 보면 되겠습니다. |
/* 1208 Flatten 문제 시작하도록 하겠습니다. 1440 이제 어느정도 노하우가 쌓여가고 있습니다. 최고점과 최저점의 차이를 반환하는 프로그램을 작성하세요. 옮기는 작업의 횟수가 제한이 걸려 있습니다. 재밌네요. 그럼 예제를 통해서 문제를 풀어보도록 ㅏ겠습니다. 평탄화가 완료되면 더 이상 덤프를 수행할 수 없으므로 그 때의 최고점과 최저점의 높이 차를 반환합니다. 2 5 8 3 1 5 6 9 9 2 2 4 */ #include <iostream> #include <algorithm> using namespace std; #define SIZE 100 // 100 int k; int map[SIZE]; int minVal = 2123456789; int maxVal; int ans; int minIndex, maxIndex; int flag; void problemIn() { cin >> k; for (int i = 0; i < SIZE; i++) { cin >> map[i]; } } void init() { minVal = 2123456789; maxVal = 0; ans = 0; flag = 0; } void findMaxMin() { for (int i = 0; i < SIZE; i++) { minVal = min(minVal, map[i]); maxVal = max(maxVal, map[i]); }
for (int i = 0; i < SIZE; i++) { if (map[i] == minVal) { minIndex = i; break; } } for (int i = 0; i < SIZE; i++) { if (map[i] == maxVal) { maxIndex = i; break; } } if (minVal == maxVal) { flag = 1; ans = 0; return; } if ((maxVal - minVal) == 1) { flag = 1; ans = 1; return; } map[maxIndex]--; map[minIndex]++; } void solve() { for (int i = 0; i < k; i++) { findMaxMin(); minVal = 2123456789; maxVal = 0; if (flag) break; } for (int i = 0; i < SIZE; i++) { minVal = min(minVal, map[i]); maxVal = max(maxVal, map[i]); } ans = maxVal - minVal; } int main() { for (int tc = 1; tc <= 10; tc++) { problemIn(); solve(); cout << "#" << tc << " " << ans << endl; init(); } return 0; } |