while (1): study();
[알고스팟] 도시락 데우기 본문
728x90
링크: https://algospot.com/judge/problem/read/LUNCHBOX
<파이썬3 소스코드>
import sys
rl = lambda: sys.stdin.readline()
def min_time():
time = [(_m, _e) for _m, _e in zip(m, e)]
time.sort(key=lambda x: x[1], reverse=True)
heat, eat = 0, 0
for current_m, current_e in time:
heat += current_m
eat = max(eat - current_m, current_e)
return heat + eat
for _ in range(int(rl())):
N = int(rl())
m = list(map(int, rl().split()))
e = list(map(int, rl().split()))
print(min_time())
<C++ 소스코드>
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
int minTime(const vector<int> m, const vector<int> e)
{
int heat = 0, eat = 0;
vector<pair<int, int>> time;
for (int i = 0; i < m.size(); i++)
time.push_back(make_pair(-e[i], m[i]));
sort(time.begin(), time.end());
for (int i = 0; i < m.size(); i++)
{
heat += time[i].second;
eat = max<int>(eat - time[i].second, -time[i].first);
}
return heat + eat;
}
vector<int>& getInput(vector<int>& vec, const int length)
{
for (int n = 0; n < length; n++)
{
int elem;
scanf("%d", &elem);
vec.push_back(elem);
}
return vec;
}
int main(void)
{
int T;
scanf("%d", &T);
for (int t = 0; t < T; t++)
{
int N;
scanf("%d", &N);
vector<int> m, e;
m = getInput(m, N);
e = getInput(e, N);
int result = minTime(m, e);
printf("%d\n", result);
}
return 0;
}
728x90
'알고리즘' 카테고리의 다른 글
[알고스팟] 출전 순서 정하기 (탐욕법 레시피) (0) | 2022.01.02 |
---|---|
최적화 문제의 결과 출력 - 배낭 문제(Knapsack Problem) (0) | 2022.01.02 |
[알고스팟] 최대 증가 부분 수열 (0) | 2021.12.30 |
[알고스팟] 삼각형 위의 최대 경로 (최적 부분 구조) (0) | 2021.12.30 |
[알고스팟] 외발뛰기 (0) | 2021.12.30 |
Comments