티스토리 뷰

반응형

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

 

15903번: 카드 합체 놀이

첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,

www.acmicpc.net


⊙ 문제

⊙ 입력

⊙ 출력

⊙ 예제 입출력

⊙ 알고리즘 분류

  • 자료 구조
  • 그리디 알고리즘
  • 우선순위 큐

 


 

⊙ 문제 접근 과정

 

결론부터 말하면 가장 작은 두 값을 더하고 두 장 모두에 덮어쓴 값이 최솟값이다.

 

4 2 3 1, 총 4장의 카드가 있다. 우선 크기 순으로 정렬해보자.

 

1 2 3 4

 

덮어썼을 때 가장 적게 값이 증가해야 한다. 그러려면 두 값 모두 작아야 한다.

한 장만 작고 한 장이 크다면 결국 큰 값이 덮어씌워져 최솟값이 되지 않는다.

 

따라서 매번 정렬하고 가장 작은 값 두개를 선택하여 덮어쓰는 것을 반복하면 된다.


 

⊙ 문제 풀이

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
typedef long long ll;

int N, M;
vector<ll> v;

int main() {
    cin >> N >> M;

    for(int i=0;i<N;i++) {
        int x;
        cin >> x;
        v.push_back(x);
    }

    for(int i=0;i<M;i++) {
        sort(v.begin(),v.end());
        ll temp=v[0]+v[1];
        v[0]=temp; v[1]=temp;
    }

    ll total=0;

    for(int i=0;i<v.size();i++)
        total+=v[i];
    

    cout << total;
}

⊙ 결과

 


⊙ 마무리

 

 

NONE

 

좋아요 로그인하지 않아도 누를 수 있습니다!

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함