luogu tyvj 紀念品分組
阿新 • • 發佈:2017-07-01
cat name pan 程序 包括 flag data content numbers
紀念品分組
描述
元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據價格進行分組,但每組最多只能包括兩件紀念品, 並且每組紀念品的價格之和不能超過一個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。
你的任務是寫一個程序,找出所有分組方案中分組數最少的一種,輸出最少的分組數目。
【限制】
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
Copy
樣例輸出1
6
Copy
限制
各個測試點1s
來源
Noip2007普及組第2題
從兩頭向中間:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N=30010; int a[N]; int w,n; int r; int js=0; int answer=0; inline int read() { int x=0;char c=getchar(); while(c<‘0‘||c>‘9‘)c=getchar(); while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar(); return x; } bool cmp(int a,int b) { return a>b; } int main() { w=read(); js=0; answer=0; n=read(); r=n; for(int i=1;i<=n;i++) a[i]=read(); sort(a+1,a+n+1,cmp); bool flag=1; for(int i=1;i<=n;i++) { int now=a[i]; while(now+a[r]<=w) { if(i==r) { printf("%d",answer+1); return 0; } now+=a[r--]; js++; if(js==n) { printf("%d\n",answer++); return 0; } } js++; answer++; if(js==n) printf("%d\n",answer); } return 0; }
luogu tyvj 紀念品分組