説明
元旦には近づいて、学生は仕事の発行レレお土産新年のパーティーのために責任を負うことになります。このようにして得られたパーティのお土産値に学生は比較的バランスが取れている、彼はお土産を購入したい価格に応じてグループ化されているが、唯一の各それぞれの価格で2回の記念品やお土産からなる諦めを超えることはできません。整数。全ての最短時間の間にお土産で終了することを保証するために、レレは、パケットの最小数を所望しました。
あなたの仕事は、すべてのパケットがプログラムパケット出力の最小数の1パケットの最小数を見つけるためのプログラムを書くことです。
あなたの仕事は、すべてのパケットがプログラムパケット出力の最小数の1パケットの最小数を見つけるためのプログラムを書くことです。
入力
+ N 2入力ラインを含む:
各セットの価格制限とお土産の最初の行はW整数を含むように、。
第2の整数nは、お土産に利用可能なアイテムの総数を行います。
3〜n行の+ 2は正の整数PIを含有する(5 <= PI <= W)、 料金をお土産に対応します。
各セットの価格制限とお土産の最初の行は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
、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 ; }