第乙個方法很容易想到,先將n個數從小到大排序,在後面比較大的數選擇乙個數+最小的數要<=k,當然要滿足貪心的要求,足夠的接近k,找到了就刪除最小的數和這個數,再繼續一樣的操作,沒有找到就可以直接判斷結果了,因為剩下的數都是乙個數一組的,但是找數可不能直接乙個迴圈查詢,n比較大,時間複雜度n^2肯定超時,除非資料不行,所以一般要線性時間或者nlogn才可以,所以使用二分查詢logn時間複雜度,但是還要刪除數啊,普通陣列刪除數比較麻煩,所以使用stl的vector,比較方便。
賦**:
第二個方法,首先以為都是乙個數一組,組數=n,再判斷最大的數是否可以和最小的的數乙個組,不可以就說明,最大的數肯定是單獨乙個組的,刪除最大的數,組數不變,如果可以就刪除最大的數和最小的數,組數-1,因為最大的數的組可以刪除了。#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;
}
#include
#include
using namespace std;
int n,k;
int ans[
31000];
intmain()
else l--;}
printf
("%d"
,cnt)
;return0;
}
NOIP2007普及組 紀念品分組
輸入格式 元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是寫...
NOIP2007普及組 紀念品分組 貪心
元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是寫乙個程式...
noip普及組2007 紀念品分組
元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是寫乙個程式...