https://www.acmicpc.net/problem/20300

 

20300번: 서강근육맨

PT 첫째 날에 $1$과 $4$를 선택하고, 둘째 날에 $2$와 $3$을 선택하고, 마지막 날에 $5$를 선택하면 $M$은 $5$가 되며, 이때가 $M$이 최소일 때이다.

www.acmicpc.net

 

이 문제는 정말 간단하다. 

음 먼저 최솟값을 구해야하기 때문에 

작은 것 끼리 더하는게 아닌, 

어릴 적 덧셈 빨리 하는 법 하면 기억나는 

첫번째 자리랑 끝자리 더해서 n/2만큼 반복하면 합이 나온다는 방법을 이용했다 

(방법 이름이 생각 안 난다. )

 

 

어쨋든 

알고리즘

  • 개수를 입력받는다. 
  • 개수만큼 숫자를 받고
  • 정렬한다. 
  • 받은 개수가 짝수이면
    • 앞자리 , 끝자리 더한다
    • 앞자리 ++, 끝자리 ++ n/2번 더한다. 
  • 받은 개수가 홀수이면
    • 끝자리 max_num으로 넣고
    • 짝수와 같이 진행한다. 

여기서 add_num을 다르게 한 이유가. 

홀수는 끝자리를 먼저 더해서 -2를 한 것이고, 

짝수는 끝자리 배열 인덱스를 접근하기 위해서다.

 

 

코드는 

#include <iostream>
#include<vector>
#include <algorithm>
using namespace std;

int main() {

	int testcase;
	cin >> testcase;
	vector<long long> input;
	long long output_max = 0;
	long long num;
	for (int i = 0; i < testcase; i++) {
		cin >> num;
		input.push_back(num);
	}

	sort(input.begin(), input.end());
	int add_num = 1;
	if (testcase % 2 == 1) {
		output_max = max(output_max, input[testcase - 1]);
		add_num = 2;
	}
	for (int i = 0, end = testcase - add_num; i < testcase / 2; i++,end--) {
		output_max = max(output_max, input[i] + input[end]);
	}
	cout << output_max;
	return 0;
}

 

+ Recent posts