1. 程式人生 > >2016西電校賽網路賽 Problem G 合併模板

2016西電校賽網路賽 Problem G 合併模板

Problem G

合併模板

XDU Fate 有 n 個 ACM/ICPC 比賽的模板,每個都是一個獨立的 PDF 文
件。為了便於列印,萬神希望將這些模板合併成一個 PDF 檔案。萬神有一個工
具,可以將至多 k 個 PDF 檔案合併為 1 個,合併後的檔案大小是原來 k 個文
件的大小之和。萬神發現,這個工具每次執行的時間正比於輸出檔案的大小。設
每輸出 1KB 需要 1 單位時間,那麼萬神至少要多少時間才能合併完所有的檔案
呢?
輸入格式
輸入檔案包含多組資料(最多 100 組),請處理到檔案結束。
每組資料包含 2 行,第 1 行包含兩個整數 n、k,用空格分割。
第二行包含 n 個整數 s 1 · · · s n ,用空格分割,表示原始的 n 個模板檔案的大
小(單位為 KB)。
保證 1 ≤ n ≤ 1000,2 ≤ k ≤ 1000,1 ≤ s i ≤ 10 9 。

輸出格式

對於每組資料輸出 1 行,表示合併所有檔案需要的最短時間。

輸入樣例

7 4
1 2 3 4 5 6 7
3 5
1 2 3

輸出樣例

38
6

樣例解釋

對於第一組樣例,首先合併前 4 個檔案,耗費 10 單位時間。之後把生成的
大小 10KB 的檔案和後 3 個檔案合併,耗費 28 單位時間,共計 38 單位時間。不
存在時間更少的合併方案。
對於第二組樣例,可以一次合併所有檔案。

HINT

對於較大的資料,你可能需要使用 64 位整數。

思路:

非連續,各數不定的石子歸併,但是與石子歸併八竿子不打,相當於可移動的,可一次合併多個的石子歸併,
主要是貪心

的方法,每次取當前堆中最小的k堆進行合併,一定能保證合併的總和最小,原則是大檔案合併次數越少越好,而且每次合併的檔案個數越多越好,
光按上述思想會Wrong
例如:共6個檔案 ,一次最多合併4個,每個檔案大小分別為: 1 2 3 4 5 6按上述方法進行合併:
找最小4個:1, 2, 3, 4 求和 = 10 再將5 6 10 進行合併,求和=11,總共時間11+10 = 21, 再看:現將1 2 3合併得6 再將 4, 5, 6, 6 合併,得11 ,總時間 11+6 = 17<21,那麼將怎麼考慮呢?
首先,如果給出的檔案數,恰好可以m次合併成一個即 n %(k-1) == 1時,上述方法正確,否則不正確,,所以要將檔案數補成使其恰好可以經過m次每次合併k個檔案,合併為1件,怎麼補?肯定補0嘛,或者,將最小的幾個(<k) 合併為1個之後,使之剩餘的加上這一個可以完美合併,再進行合併, 這樣就可以求得最小,因為大的合併次數越少越好,保證大的參與的合併一定有k個檔案.
下面採用補0的方法進行合併,,注意當k==2時 任意n%(k-1) 即 n%(1) 永遠不可能為1.而造成段錯誤,鄙人一開始大意疏忽沒有考慮倒k=2時,導致RE了n次...

程式碼:

/*************************************************************************
        > File Name: g.cpp
      > Author: dulun
      > Mail: [email protected]
      > Created Time: 2016年04月21日 星期四 12時53分26秒
 ************************************************************************/

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;

const int N = 999909;
LL a[N+N];

int main()
{
    int n, k;
    while(cin>>n>>k)
    {
        memset(a, 0, sizeof(a));
        for(int i = 0; i < n; i++)
            scanf("%lld", &a[i]);

        if(n == 1)
        {
            printf("%lld\n", a[0]);
            continue;
        }

        if(k != 2)
        {
            while(n % (k-1) != 1)
            a[n++] = 0;
        }

        sort(a, a+n);
        int m = 0;
        LL ans = 0;
        while(m <= n-k)
        {
            for(int i = 0; i < k-1; i++)
            {
                a[m+k-1] += a[i+m];
            }
            ans += a[m+k-1];
            m += k-1;
            sort(a, a+n);
        }
        cout<<ans<<endl;
    }
    return 0;
}

相關推薦

2016西網路 Problem G 合併模板

Problem G 合併模板 XDU Fate 有 n 個 ACM/ICPC 比賽的模板,每個都是一個獨立的 PDF 文 件。為了便於列印,萬神希望將這些模板合併成一個 PDF 檔案。萬

西10.9校內補題

sed continue ssi 最短 emp alt while pos src D.UVa12880 解題關鍵:dfs,判斷每個人是否願意被其他人交換,註意保證每個人只能被交換一次。 1 #include<cstdio> 2 #

JNU 第四屆 網路 D 迎接知名校友 【dfs+貪心】

D題 要求 n*n的方陣中 取n個數,保證每行每列各有一個,這樣的取法有n!種,這裡可以用 next_permutation求一個全排列就好了,但是由於裡面有 若干個被塗抹的數,對於一種方案來說,如果要

【2018ccpc區域網路】【hdu6447 YJJ's Salesman】【dp+離散化+樹狀陣列/線段樹優化】

連結: 分析:二維座標排序,x->大,y->小,由於我們每次走必須x,y均變大,那麼相當於只要考慮排序後的y的值。從左往右考慮y,dp[i]=max(dp[j])+val[i](i表示第i個點),由於y的資料範圍為1e9,需要離散化,然後用樹狀陣列維護求最大

2017青島賽區亞洲區域網路 1011題題解

Problem Description A cubic number is the result of using a whole number in a multiplication three times. For example, 3×3×3=27 so 27 is

2018年西ACM網路

地址連結 A 遞推sum[i] = sum[i - 1] + i - 1 B 最大公約數 C 貪心。先快排,前n / 2個數沒有用,將中位數及其之後的數放入小頂堆中。每次取出堆頂元素,糖的數量+1或加到比下一個數大1,再入堆。最後的堆頂就是答案。 STL中的堆可

# XDU1200題解(西17年E題)

XDU1200題解 題意 漢諾塔問題 本題將古老問題做了點改動,每一個圓盤有相同的兩個,但是實際上這兩個圓盤必須同時移動,所以只需要將最終步驟乘2即可。 箋釋 自己推導了一下這個問題。 首先可知,要想把處於最下層的盤X移動到C柱,必須把其上的

2016移動開發之Android實踐

android 學校組織的《移動互聯網應用軟件開發》技能競賽,所有參賽命題均基於 Android 4.2 版本實現,比賽推薦使用的開發環境為:ADT, JDK 1.6, Android SDK 4.1   經過了四天的培訓我們小組選擇在計算器應用 計算器能夠實現: 1. 數學四則運算 2. 實現開方元算

HDU 5371 (2015多聯合訓練第七場1003)Hotaru&#39;s problem(manacher+二分/枚舉)

2015多校 while bre 算法 down ice man 暴力 turn pid=5371">HDU 5371 題意: 定義一個序列為N序列:這個序列按分作三部分,第一部分與第三部分同樣,第一部分與第二部分對稱。 如今給你一個長為n(n

2018.11.3 杭薛貓貓杯程式設計網路

趙寶樂_通訊工程一班_0題         第一次參加程式設計網路賽,賽前還有些緊張,畢竟不像其他人有些基礎。我在軍訓後、加入acm集訓隊前,連scanf都不知道......後來跟他們相處,發現他們怎麼那麼優秀,知道的知識那麼多,我連語言的規則還沒弄清楚他們已經會一些

【2018 南京賽區網路】 An Olympian Math Problem

原題連結 題目翻譯: Alice 是一個六年級的女孩,正在考慮一個奧林匹克的數學問題,但是她感覺非常沮喪所以就開始哭泣。她的同學Bob也沒有關於這道題的思路,因此他想讓你幫助他解決。這個問題是: K: k!=1×2×⋯×(k−1)×k S: S=1×1!+2×2!+⋯+ (n

2018 ACM-ICPC 亞洲青島區域網路 C Halting Problem

In computability theory, the halting problem is the problem of determining, from a description of an arbitrary computer program, whether

2018 青島網路C題Halting Problem

判斷一個指定的程式是一直執行下去還是會停止。停止好判斷,就是如何判斷是否會一直執行下去。當第二次到達第n步的時候,如果此時的r仍然是第一次到達第n步時候的r,那麼這個程式會一直執行下去。 通過這道題還知道了對bool型別的陣列處理是比對int型別的陣列處理快的。全域性變數是

2016大連區域 現場 D—A Simple Math Problem【LCM+數學方程】

A Simple Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 729    A

2016 北京區域 現場 C—Asa's Chess Problem【有源匯上下界的最小費用最大流】

題意: 給你一個n*n(n<=50)的棋盤,棋盤上每個點0表示白棋,1表示黑棋。 接下來n行,第i行給出棋盤的 第i行 的黑棋數目的上下界[x,y]。 接下來再n行,第i行給出棋盤的 第i列 的黑棋數目的上下界[x,y]。 接下來n*n/2行,每

2016 acm/icpc 青島網路 題解(hdu 5878-5889,9道題)

5878.I Count Two Three(打表預處理,二分) 題目大意:有一些數可以寫成2a3b5c7d的形式,稱之為”I count two three numbers”.輸入一個數,問比他大的最小的”I count two three number

今日頭條杯 2018 年首屆湖北省大學生程式設計競賽 (網路)Problem B.(計算幾何)

Problem B. GSS and Interesting SculptureInput file: standard inputOutput file: standard outputTime limit: 1 secondsMemory limit: 512 mebib

(搬磚)

搬磚 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 5101    Accepted Submission(s

CTF--2016中國西安西華山杯網路安全技能大賽之crackme6

Crackeme6 write up(help me) 0x01 為了照顧水平技術差異化,本題解答對大神來說,有些繁瑣。(大神可以忽略飄過) 方便一部分逆向新手學習。 0x02 命令列行程式上圖顯示崩潰,剛開始還懷疑程式編寫的有問題。 於是先暫時用IDA載入測試一

hdu 5381 The sum of gcd 2015多聯合訓練#8莫隊算法

names 來看 efi nbsp span ems multipl script there The sum of gcd Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K