【藍橋杯 算法訓練 ALGO - 34】紀念品分組(貪心 + 排序)

目錄

1 題目

問題描述

輸入格式

輸出格式

樣例輸入

樣例輸出

數據規模和約定

2 分析

3 題解


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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章