P1090 合併果子

 

P1090 合併果子

    • 14.7K通過
    • 40.9K提交
  • 題目提供者CCF_NOI
  • 評測方式雲端評測
  • 標籤NOIp提高組2004高性能
  • 難度普及/提高-
  • 時空限制1000ms / 128MB

 提交  題解   

  • 提示:收藏到任務計劃後,可在首頁查看。

最新討論顯示

推薦的相關題目顯示

題目描述

在一個果園裏,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。

每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1n−1 次合併之後, 就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。

因爲還要花大力氣把這些果子搬回家,所以多多在合併果子時要儘可能地節省體力。假定每個果子重量都爲 11 ,並且已知果子的種類 數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。

例如有 33 種果子,數目依次爲 11 , 22 , 99 。可以先將 11 、 22 堆合併,新堆數目爲 33 ,耗費體力爲 33 。接着,將新堆與原先的第三堆合併,又得到新的堆,數目爲 1212 ,耗費體力爲 1212 。所以多多總共耗費體力 =3+12=15=3+12=15。可以證明 1515 爲最小的體力耗費值。

輸入輸出格式

輸入格式:

 

共兩行。
第一行是一個整數 n(1\leq n\leq 10000)n(1≤n≤10000) ,表示果子的種類數。

第二行包含 nn 個整數,用空格分隔,第 ii 個整數 a_i(1\leq a_i\leq 20000)ai​(1≤ai​≤20000) 是第 ii 種果子的數目。

 

輸出格式:

 

一個整數,也就是最小的體力耗費值。輸入數據保證這個值小於 2^{31}231 。

 

輸入輸出樣例

輸入樣例#1: 複製

3 
1 2 9 

輸出樣例#1: 複製

15

這一題是明顯的貪心算法,只需要不斷的取最小的兩個值就能得解,我一開始是用一個數組存儲所有的值排序後取最前面兩個值,兩數值之和放入數組中,再次排序,如此反覆直到進行n-1次,結果很輕鬆的超時了。

然後我看到了這位大佬的,很精巧,用兩個排好序的數組分別爲原來的,組合的,取數的時候只用判斷兩個數組前面的數的大小,取小值,新值再加到組合的數組內。

原址https://www.luogu.org/blog/user52918/solution-p1090

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int k,x,num,n1,n2,a1[30001],a2[30001],t[20001],w,sum;
int main()
{
    scanf("%d",&num);
    memset(a1,127/3,sizeof(a1));
    memset(a2,127/3,sizeof(a2));
    for (int i=1;i<=num;i++)
    {
        scanf("%d",&x);
        t[x]++;//桶
    }
    for (int i=1;i<=20000;i++)
    {
        while (t[i])//通排序
        {
            t[i]--;
            a1[++n1]=i;
        }
    }
    int i=1,j=1;
    k=1;
    while (k<num)
    {
        if (a1[i]<a2[j])//取最小值
        {
            w=a1[i];
            i++;
        }
        else
        {
            w=a2[j];
            j++;
        }
        if (a1[i]<a2[j])//取第二次
        {
            w+=a1[i];
            i++;
        }
        else
        {
            w+=a2[j];
            j++;
        }
        a2[++n2]=w;//加入第二個隊列
        k++;//計算合併次數
        sum+=w;//計算價值
    }
    printf("%d",sum);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章