noip普及組2007 紀念品分組
阿新 • • 發佈:2017-07-29
spa 滿足 格式 oca mes logs pac syn 相對
紀念品分組
描述
元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據價格進行分組,但每組最多只能包括兩件紀念品, 並且每組紀念品的價格之和不能超過一個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。
你的任務是寫一個程序,找出所有分組方案中分組數最少的一種,輸出最少的分組數目。
【限制】
50%的數據滿足: 1 <=n <= 15
100%的數據滿足: 1 <= n <= 30000, 80 <= W <= 200
格式
輸入格式
第1行包括一個整數w,為每組紀念品價格之和的上限= 第2行為一個整數n,表示購來的紀念品的總件數G
第3-n+2行每行包含一個正整數Pi (5 <= Pi <= w3)w表示所對應紀念品的價格。
輸出格式
僅1行,包含一個整數, ep最少的分組數目合
樣例1
樣例輸入1
100
9
90
20
20
30
50
60
70
80
90
樣例輸出1
6
限制
各個測試點1s
這題是一題貪心題,我們把價格都排一遍序,然後用兩個指針l,r表示左右端點,如果兩大的和小的不超出限制,我們就把它們分為一組,否則大的單獨為一組
#include <iostream> #include <algorithm> using namespace std; //ifstream cin("group.in",ios :: in); //ofstream cout("group.out",ios :: out); int a[30001],n,m; int main() { ios :: sync_with_stdio(false); //流的加速 cin >> m >> n; for(int i = 1;i <= n;i++) cin >> a[i]; sort(a+1,a+n+1); //排序,規則:從小到大 int l = 1,r = n,ans = 0; while (l <= r) { //拿小的和大的分 if (a[l]+a[r] <= m && l != r) { //如果不超過限制且l和r不同 ans++; l++; r--; } else { //否則大的單獨分為一組 ans++; r--; } } cout << ans; return 0; }
noip普及組2007 紀念品分組