NOIP2007普及組 紀念品分組

2022-09-13 04:12:11 字數 1434 閱讀 5177

【輸入格式】

元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得的紀念品價值相對均衡,他要把購來的紀念品根據**進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的**之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。

你的任務是寫乙個程式,找出所有分組方案中分組數最少的一種,輸出最少的分組數目。

【輸入格式】

輸入包含n+2行:

第1行包括乙個整數w,為每組紀念品**之和的上限,第2行為乙個整數n,表示購來的紀念品的總件數g。

第3-n+2行每行包含乙個正整數pi(5<=pi<=w3)w表示所對應紀念品的**。

【輸出格式】

輸出僅一行,包含乙個整數,即最少的分組數目。

【輸入樣例1】   【輸出樣例1】

100    6990

2020

3050

6070

8090

【提示】

50%的資料滿足: 1 <=n <= 15

100%的資料滿足: 1 <= n <= 30000, 80 <= w <= 200

【題解】

這題很顯而易見地可以使用貪心演算法來解。

考慮最便宜的紀念品i,它應該跟哪個紀念品同組?如果其它的每個紀念品都不能和它一起同組,那麼只能每個紀念品單獨一組,但如果有可以跟它一起同組的紀念品,那紀念品i就應該選擇能和它同組的紀念品中最重的乙個紀念品j。這樣的分組可以讓分的組盡可能的少。這是乙個貪心策略。

所以得出貪心策略:最便宜的紀念品和最貴的紀念品分組。

很顯然,這個貪心策略的正確性和有效性可以通過反證法證明。證明如下:

假設這個貪心策略不是最優解,那最優方案中的紀念品i應該如何?

情況1:i不和任何紀念品分組。如此的話可以把j加進來分到同一組,分組數不會增加(甚至還有可能減少)。符合貪心策略。

情況2:i和另乙個紀念品k同組,其中k比j便宜。把k和j交換後,原來的分組仍不會超過**上限(顯而易見的事實:k比j便宜)。因此i和j同組,所得新解不會更差。符合貪心策略。

由此可見:這樣的貪心策略不會丟失最優解。

附上**:

【實現**】

#include using

namespace

std;

intn,w;

int ans=0

;int num[35010]=;

int cheap=1

,dear;

intmain()

【**解釋】

在前面的分析中,比j還貴的紀念品只能單獨乙個組。故我們只需兩個指標cheap和dear,分別表示最便宜的和最貴的紀念品(排序後)。若兩個紀念品不能同組,就將dear的紀念品單獨一組。若可以則繼續分組(cheap++,dear--;)。直到每個紀念品都可以分組。

2020-03-29 17:01:36

NOIP2007 普及組 紀念品分組

第乙個方法很容易想到,先將n個數從小到大排序,在後面比較大的數選擇乙個數 最小的數要 k,當然要滿足貪心的要求,足夠的接近k,找到了就刪除最小的數和這個數,再繼續一樣的操作,沒有找到就可以直接判斷結果了,因為剩下的數都是乙個數一組的,但是找數可不能直接乙個迴圈查詢,n比較大,時間複雜度n 2肯定超時...

NOIP2007普及組 紀念品分組 貪心

元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是寫乙個程式...

noip普及組2007 紀念品分組

元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是寫乙個程式...