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

 

20300번: 서강근육맨

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

www.acmicpc.net

코드설명

그리디 문제입니다.

 

문제예시로

5

1 2 3 4 5 가 있다고 가정합니다.

 

근손실 최소값을 구하기 위해서는 가장 큰 숫자와 가장 작은 숫자의 합이 최소값일 것입니다.

그러기 위해서 오름차순 정렬을 하면, 첫번째 숫자와 끝자리 숫자와의 합이 최소값입니다.

 

N이 짝수라면, 가장 큰 숫자도 같이 짝을 이루고,

N이 홀수라면,  마지막 숫자는 짝을 이루지 않습니다.

 

둘째 줄에는 각 운동기구의 근손실 정도를 나타내는 정수 T의 범위가 0 <= t <= 10^18 이기에 Long type을 활용해야합니다. 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int N;
public static long[] arr;
public static long result = 0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
arr = new long[N];
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
arr[i] = Long.parseLong(st.nextToken());
}
Arrays.sort(arr);
result = arr[N-1];
long a = 0;
long b = 0;
if(N == 1) {
System.out.println("1");
return ;
}
for(int i=0;i<N/2;i++) {
a = arr[i];
if(N%2 == 0) {
b = arr[N-1-i];
}else if(N%2==1) {
b = arr[N-1-1-i];
}
result = Math.max(result, a + b);
}
System.out.println(result);
}
}

 

더 직관적인 코드입니다.

홀수라면, 가장 큰값은 혼자 운동하도록 처리합니다.

package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.TreeMap;
public class Main {
private static int N, M, Q, K;
private static long[] arr;
private static int answer = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
arr = new long[N];
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
arr[i] = Long.parseLong(st.nextToken());
}
Arrays.sort(arr);
int left = 0, right = N-1;
long sum = 0;
if(left == 0 && right == 0) {
sum= arr[0];
System.out.println(sum);
return ;
}
if(N%2 == 1) {
sum = Math.max(sum, arr[N-1]);
right -= 1;
}
while(left < right) {
sum = Math.max(sum, arr[left] + arr[right]);
left++;
right--;
}
System.out.println(sum);
}
}

+ Recent posts