1481お土産パケット(水問題)

説明

   元旦には近づいて、学生は仕事の発行レレお土産新年のパーティーのために責任を負うことになります。このようにして得られたパーティのお土産値に学生は比較的バランスが取れている、彼はお土産を購入したい価格に応じてグループ化されているが、唯一の各それぞれの価格で2回の記念品やお土産からなる諦めを超えることはできません。整数。全ての最短時間の間にお土産で終了することを保証するために、レレは、パケットの最小数を所望しました。   
        あなたの仕事は、すべてのパケットがプログラムパケット出力の最小数の1パケットの最小数を見つけるためのプログラムを書くことです。

入力

  + N 2入力ラインを含む:   
       各セットの価格制限とお土産の最初の行は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
書式#include <cstdioを> 
する#include <iostreamの> 
の#include <cmath> 
の#include < 文字列 > 
の#include <CStringの> 
の#include <アルゴリズム> 
書式#include <キュー> 
の#include <ベクトル> 
の#include <マップ>
 使用して 名前空間はstd;
#defineは長い長いっ
 のconst  int型 MAXN = 5100 ; 

INTの N、P、W [ 30000 + 8 ]、L、R、ID [ 30000 + 8 ]、[署名30000 + 8 ]、NUM。

int型メイン()
{ 
    scanf関数(" %のD "、&W)。
    scanf関数(" %のD "、&N)
    NUM = 0 ; 
    memsetの(符号、0はsizeof (符号))。
    以下のためにint型 i = 0 ; iがn <I ++の
        のscanf(" %dの"、&Pを[I])。
    ソート(P、P + N、大きな< INT > ());
    int型 D = N- 1 ;
    以下のためのint型I = 0 ; 私は、n <; i)は、ID ++を[I] = I。
    以下のためにint型 i = 0 ; iがn <; iは++ 
    { 
        場合(P [I] + P [D] <= && wは![i]が署名)
        { 
            IDを[I] = D。
            [D]署名 =ログイン[I] = 1 
            D - ; 
            NUM ++ ; 
        } 
        そう であれば(P [I] + P [D]> && W![i]が署名)
        { 
            [i]はサイン = 1 
            NUM ++ ;
        } 
    } 
    のprintf(" %d個の\ n " 、NUM)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/RootVount/p/11248639.html