과일 [더미, 욕심]

제목.
n 더미 의 크기 가 다른 과일 더미 가 있 습 니 다. 매번 두 더 미 를 합 칠 때마다 두 더미 의 무 게 를 소모 합 니 다. 그것들 을 모두 합 친 최소 소 모 를 구 합 니 다.
입력
입력 은 두 줄 을 포함 하고 첫 번 째 줄 은 정수 n (1) 입 니 다.
출력
출력 은 한 줄 을 포함 합 니 다. 이 줄 은 하나의 정수 만 포함 합 니 다. 즉, 최소 체력 소모 값 입 니 다. 데 이 터 를 입력 하면 이 값 이 2 ^ 31 보다 작 습 니 다.
샘플 입력
3 1 2 9
샘플 출력
15
문제 풀이 의 사고 방향.
욕심 은 매번 가장 작은 두 개 를 합 치 는 것 이다. 여 기 는 쌓 는 것 이 편리 하 다.
코드
#include
using namespace std;
int a[10001],num,x,n;
long long s,u;
void up(int x)
{
    int t;
    while (x>1 && a[x]2])
{
t=a[x];a[x]=a[x/2];a[x/2]=t;
x/=2;
}
} / / 로 더 를 조정 합 니 다.
void down(int x)
{
int t,y;
while (x*2<=num && a[x]>a[x*2] || x*2+1<=num && a[x]>a[x*2+1])
{
y=x*2;
if (x*2+1<=num && a[x*2]>a[x*2+1]) y++;
t=a[x];a[x]=a[y];a[y]=t;
x=y;
}
} / / 로 더 를 조정 합 니 다.
void insert(int x)
{a [+ num] = x; up (num);} / / 요소 삽입
int main()
{
scanf("%d",&n); 
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
insert(x);
} / / 쌓 기
while (num>1)
{
u=a[1];a[1]=a[num];num--;down(1);
u + = a [1]; a [1] = a [num]; num -; down (1); / / 두 개의 가장 작은 것 을 취하 다
s + = u; num + +; a [num] = u; up (num); / / 합병 후 되 돌려 놓 기
}
printf("%d",s);
}

좋은 웹페이지 즐겨찾기