알고리즘/SW Expert Academy
[D3] 9229. 한빈이와 Spot Mart
혬혬
2020. 3. 10. 18:22
728x90
정렬을 한 이후, 최소값(start_point)과 m보다 작은 최댓값(end_point) 2개를 가지고 두개의 합이 m보다 클 경우, end_point를 옮겨서 두 개의 합을 줄이도록 하였다. 두개의 합이 m보다 작을 경우, start_point를 옮겨서 두개의 합을 크게하도록하엿다.
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(void) {
freopen("inp.inp", "r", stdin);
freopen("out.out", "w", stdout);
int tc = 0;
cin >> tc;
for (int q = 0; q < tc; q++) {
int n = 0;
int m = 0;
cin >> n >> m;
int start_point = 0;
int end_point = n-1;
int snack_list[1010] = { 0 };
for (int i = 0; i < n; i++) {
cin >> snack_list[i];
if (snack_list[i] <= m)
end_point = i;
}
sort(snack_list, snack_list + n);
int answer = -1;
while (1) {
if (start_point == end_point)
break;
if (snack_list[start_point] + snack_list[end_point] <= m&&answer< snack_list[start_point] + snack_list[end_point]) {
answer = snack_list[start_point] + snack_list[end_point];
}
if (snack_list[start_point] + snack_list[end_point] > m) {
end_point--;
}
else if(snack_list[start_point] + snack_list[end_point] <= m){
start_point++;
}
}
cout <<"#"<<q+1<<" "<< answer<<endl;
}
return 0;
}
728x90