1. 程式人生 > >noip普及組2007 紀念品分組

noip普及組2007 紀念品分組

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 紀念品分組