알고리즘/백준
백준 23843 콘센트 c++
이영재의오른발
2022. 12. 23. 10:30
반응형
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> vec;
vector<int> consent;
int n,m;
bool cmp(int a,int b) {
return a > b;
}
void input() {
cin >> n >> m;
int tmp;
for(int i=0; i<n; i++) {
cin >> tmp;
vec.push_back(tmp);
}
}
void solve() {
sort(vec.begin(),vec.end(),cmp);
int time = 0;
for(int i=0; i<m; i++) {
consent.push_back(vec[0]);
vec.erase(vec.begin());
if(vec.empty()) {
break;
}
}
while(1) {
if(vec.size() == 0) {
if(consent.empty()) {
break;
}
sort(consent.begin(),consent.end(),cmp);
time = time + consent[0];
break;
}
sort(consent.begin(),consent.end(),cmp);
time += consent[m-1];
for(int i=0; i<consent.size(); i++) {
consent[i] = consent[i] - consent[consent.size()-1];
}
for(int i=consent.size()-1; i>=0; i--) {
if(consent[i] == 0) {
consent[i] = consent[i] + vec[0];
vec.erase(vec.begin());
}
if(vec.empty()) {
break;
}
}
}
cout << time;
}
int main() {
input();
solve();
}
** 그리디 + 정렬 **
1. 충전 시간 기준 내림차순으로 전자기기를 정렬한다.
2. 정렬한 전자기기를 큰 순서대로 콘센트에 꽂는다.
2. 콘센트에 꽂힌 전자기기 중 가장 짧은 충전 시간을 가진 전자기기를 기준으로 콘센트에 꽂혀있는 전자기기의 충전시간을 빼준다.
3. 빼준 충전시간을 전체 시간에 더해준다.
4. 콘센트에 더 꽂을 전자기기가 없을 경우 남아있는 콘센트 중 가장 시간이 많이 남은 전자기기를 전체 시간에 더해준다.
728x90
반응형