• codevs 1143 纪念品分组


    1143 纪念品分组

     

    2007年NOIP全国联赛普及组

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 白银 Silver
     
     
     
    题目描述 Description

    元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。

    你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

    输入描述 Input Description

    包含n+2行:

    第1行包括一个整数w,为每组纪念品价格之和的上限。

    第2行为一个整数n,表示购来的纪念品的总件数。

    第3~n+2行每行包含一个正整数pi (5 <= pi <= w),表示所对应纪念品的价格。

    输出描述 Output Description

    仅一行,包含一个整数,即最少的分组数目。

    样例输入 Sample Input

    100

    9

    90

    20

    20

    30

    50

    60

    70

    80

    90

    样例输出 Sample Output

    6

    数据范围及提示 Data Size & Hint

    50%的数据满足:1 <= n <= 15

    100%的数据满足:1 <= n <= 30000, 80 <= w <= 200

    【思路】

    贪心

    让价值最小的和价值最大的分在一组。

    【code】

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int vis[30005];
    int n,lit,flag,s,ans;
    int v[30005];
    int main()
    {
        scanf("%d",&lit);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&v[i]);
        }
        sort(v+1,v+n+1);
        int s=n;
        for(int i=1;i<=n;i++)
        {
            if(vis[i])break;
            flag=0;
            while(s&&!flag)
            {
                if(v[i]+v[s]<=lit)
                {
                    if(s==i)break;
                    vis[s]=1;    
                    flag=1;
                    ans++;
                }
                s--;
            }
        }
        printf("%d
    ",n-ans);
        return 0;
    }

    黄学长的code,我的代码宛如一个智障。

    C++
    
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int mx,n,ans=0;
        int a[30001];
        cin>>mx>>n;
        for(int i=1;i<=n;i++)
           cin>>a[i];
        sort(a+1,a+n+1);
        int l=1,r=n;
        while(l<=r)
        {
            if(a[l]+a[r]<=mx){l++;r--;}
            else r--;
            ans++;
        }
        if(l==r)ans++;
        cout<<ans;
        return 0;
    }
    
  • 相关阅读:
    我要AFO啦好伤感啊
    noip2012~2015刷题小记录
    【20161114模拟赛】
    第5模块闯关CSS练习题
    HTML练习题
    Mysql常用命令行大全
    mysql破解密码安装与基本管理
    python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点
    Python/ selectors模块及队列
    python3 中 Event.wait 多线程等待
  • 原文地址:https://www.cnblogs.com/zzyh/p/6994134.html
Copyright © 2020-2023  润新知