NOIP2007 普及組 紀念品分組

2021-08-08 00:10:48 字數 1173 閱讀 5362

第乙個方法很容易想到,先將n個數從小到大排序,在後面比較大的數選擇乙個數+最小的數要<=k,當然要滿足貪心的要求,足夠的接近k,找到了就刪除最小的數和這個數,再繼續一樣的操作,沒有找到就可以直接判斷結果了,因為剩下的數都是乙個數一組的,但是找數可不能直接乙個迴圈查詢,n比較大,時間複雜度n^2肯定超時,除非資料不行,所以一般要線性時間或者nlogn才可以,所以使用二分查詢logn時間複雜度,但是還要刪除數啊,普通陣列刪除數比較麻煩,所以使用stl的vector,比較方便。

賦**:

#include

#include

#include

#include

using namespace std;

vector<

int>g;

int n,k;

void

match

(int min)

else}if

(rfor(

int i=l;i>=r;i--)}

else

}int

main()

sort

(g.begin()

,g.end()

);int cnt=0;

bool isok=true;

while

(isok)

if(min +

*g.begin()

>k)

match

(k-min)

; cnt++;}

printf

("%d\n"

,cnt)

;return0;

}

第二個方法,首先以為都是乙個數一組,組數=n,再判斷最大的數是否可以和最小的的數乙個組,不可以就說明,最大的數肯定是單獨乙個組的,刪除最大的數,組數不變,如果可以就刪除最大的數和最小的數,組數-1,因為最大的數的組可以刪除了。

#include

#include

using namespace std;

int n,k;

int ans[

31000];

intmain()

else l--;}

printf

("%d"

,cnt)

;return0;

}

NOIP2007普及組 紀念品分組

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

NOIP2007普及組 紀念品分組 貪心

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

noip普及組2007 紀念品分組

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