目錄
1 題目
問題描述
元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。爲使得參加晚會的同學所獲得的紀念品價值 相對均衡,他要把購來的紀念品根據價格進行分組,但每組最多隻能包括兩件紀念品,並且每組紀念品的價格之和不能超過一個給定的整數。爲了保證在儘量短的時 間內發完所有紀念品,樂樂希望分組的數目最少。
你的任務是寫一個程序,找出所有分組方案中分組數最少的一種,輸出最少的分組數目。
輸入格式
輸入包含n+2行:
第1行包括一個整數w,爲每組紀念品價格之和的上限。
第2行爲一個整數n,表示購來的紀念品的總件數。
第3~n+2行每行包含一個正整數pi (5 <= pi <= w),表示所對應紀念品的價格。
輸出格式
輸出僅一行,包含一個整數,即最少的分組數目。
樣例輸入
100
9
90
20
20
30
50
60
70
80
90
樣例輸出
6
數據規模和約定
50%的數據滿足:1 <= n <= 15
100%的數據滿足:1 <= n <= 30000, 80 <= w <= 200
2 分析
貪心水題,沒啥說的,上來排個序再處理一下就ok。
3 題解
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 30005;
int arr[maxn] = {0};
bool cmp(int a, int b){
return a > b;
}
int main(){
//freopen("input.txt", "r", stdin);
int w, n, ans = 0;
cin >> w >> n;
for(int i = 0;i < n;i++){
cin >> arr[i];
}
sort(arr, arr + n, cmp);
for(int i = 0;i < n;){
if(arr[i] + arr[n - 1] <= w){
i++;
n--;
ans++;
}else{
i++;
ans++;
}
}
printf("%d\n", ans);
return 0;
}