1. 程式人生 > >luogu tyvj 紀念品分組

luogu tyvj 紀念品分組

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 紀念品分組