문제 : https://codeforces.com/contest/1614/problem/A
처음엔 냅색문제로 예상했는데, 생각해보니 그냥 작은 값부터 그리디로 확인해봐도 만족할 것 같아 노선을 변경함!
1. 우선 전처리로, 입력으로 들어온 a 중 l 미만이거나 r 초과인 값은 버려버린다.
2. '1'에서 걸러서 남겨진 값들을 정렬한다.
3. 이제 그리디하게 작은 숫자부터 k에서 빼가면서, 0보다 작아지는 경우 그 전까지 구매할 수 있다.
코드 : github
import java.io.DataInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main extends FastInput {
StringBuilder answer = new StringBuilder();
class Pos {
int idx, a;
public Pos(int idx, int a) {
this.idx = idx;
this.a = a;
}
}
private void solve() throws Exception{
int n = nextInt();
ArrayList<Pos> arr = new ArrayList<>();
for (int i = 0; i < n; i++) {
arr.add(new Pos(i, nextInt()));
}
Collections.sort(arr, new Comparator<Pos>() {
@Override
public int compare(Pos o1, Pos o2) {
return o2.a - o1.a;
}
});
int[] crd = new int[n];
int sum = 0;
int dist = 1;
for (int i = 0; i < n; i++) {
Pos cur = arr.get(i);
if ((i&1)==0) {
crd[cur.idx] = dist;
} else {
crd[cur.idx] = -dist;
dist++;
}
sum += Math.abs(crd[cur.idx]) * cur.a * 2;
}
answer.append(sum).append('\n').append(0).append(' ');
for (int i = 0; i < n; i++) {
answer.append(crd[i]).append(' ');
}
answer.append('\n');
}
private void solution() throws Exception {
int t = nextInt();
while (t-->0) {
solve();
}
System.out.print(answer);
}
public static void main(String[] args) throws Exception {
initFI();
new Main().solution();
}
}
class FastInput {
private static final int DEFAULT_BUFFER_SIZE = 1 << 16;
private static final int MAX_CHAR_LEN_FOR_NEXT_LINE = 80;
private static DataInputStream inputStream;
private static byte[] buffer;
private static int curIdx, maxIdx;
protected static void initFI() {
inputStream = new DataInputStream(System.in);
buffer = new byte[DEFAULT_BUFFER_SIZE];
curIdx = maxIdx = 0;
}
protected static int nextInt() throws IOException {
int ret = 0;
byte c = read();
while (c <= ' ') c = read();
boolean neg = (c == '-');
if (neg) c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (neg) return -ret;
return ret;
}
private static byte read() throws IOException {
if (curIdx == maxIdx) {
maxIdx = inputStream.read(buffer, curIdx = 0, DEFAULT_BUFFER_SIZE);
if (maxIdx == -1) buffer[0] = -1;
}
return buffer[curIdx++];
}
}
'PS > BOJ' 카테고리의 다른 글
백준 20856 자바 - Tunnelbaneplatser (BOJ 20856 JAVA) (0) | 2021.11.28 |
---|---|
백준 1515 자바 - 수 이어 쓰기 (BOJ 1515 JAVA) (0) | 2021.11.28 |
백준 2697 자바 - 다음수 구하기 (BOJ 2697 JAVA) (0) | 2021.11.26 |
백준 1622 자바 - 공통 순열 (BOJ 1622 JAVA) (0) | 2021.11.25 |
백준 11969 자바 - Breed Counting (BOJ 11969 JAVA) (0) | 2021.11.24 |
댓글