알고리즘 문제

[C/C++ 백준 2785번] 체인 (Silver 2)

새파란 공대생 2020. 7. 15. 13:41

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

 

2785번: 체인

문제 희원이는 그의 다락방에서 N개의 체인을 찾았다. 각각의 체인은 몇 개의 고리로 연결되어 있는데, 각각의 고리는 최대 두 개의 인접한 고리를 가질 수 있다. 각각의 고리는 열고 닫을 수 있�

www.acmicpc.net

체인을 연결하는 방법 두가지를 조건에 따라 구현해주면 된다.

 

① 짧은 체인을 풀어 연결하는 경우

② 체인끼리 연결 부위를 연결하는 경우

 

인데, 짧은 체인을 풀어 연결하는 경우는 모두 쓸 수 있는것이 아니면 반드시 손해이므로, 모든 고리를 쓸 수 있을 때만 1번 방법을 쓰고, 나머지 경우는 2번을 쓴다. 참고로 풀어쓰는 고리는 가장 짧은 것을 고르나, 적당히 긴것을 골라 쓰나 열고 닫는 횟수는 같으므로 그냥 가장 짧은 것을 사용하자.

 

#include <cstdio>
#include <algorithm>
using namespace std;
int main(void){
	int n, chain[500001], mini=-1, ans=0, save;
	scanf("%d", &n);
	for(int i=0; i<n; i++){
		scanf("%d",&chain[i]);
	}
	sort(chain, chain+n);
	while(1){
		if(chain[0] <= n-2){
			save = chain[0];
			ans += chain[0];
			for(int j=n-1; j>=n-chain[0]; j--){
				chain[n-chain[0]-1] += chain[j];
			}
			for(int k=1; k<=n - chain[0] - 1; k++){
				chain[k-1]=chain[k];
			}	
			n = n - save -1;
		}
		else{
			ans += n-1;
			break;
		}	
	}
	printf("%d",ans);
}