【练习】纪念品分组

纪念品分组

https://ac.nowcoder.com/acm/problem/16640


题目

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

输入描述:
第 1 行包括一个整数 w,为每组纪念品价格之和的上限。
第 2 行为一个整数n,表示购来的纪念品的总件数。
第 3 ~ n+2 行每行包含一个正整数 pi ( 5 ≤ pi ≤ w ) ,表示所对应纪念品的价格。

输出描述:
包含一个整数,即最少的分组数目。


解析

根据题目意思,为什么要讲题目,没错我又看错题了。题目要求每组最多两个纪念品,要使组数尽量少(这么瞎,我选拔赛怎么办啊orz)。
  • 既然要组数尽量少,非常容易的就会想到:每组的纪念品价格要尽量的大

算法讲解
  1. 我们要价格大,题目给了我们一个非常方便的条件:所有物品价格都没有要求价格大(虽然有也没事,这些买不了)。
  2. 那我们怎么分组呢?这道题毫无疑问就是贪心,而且贪的就是每个价格最大
  3. 所以我们理所当然的就想到了:组里面放一个最大的,然后与之相配,就看能不能加一个最小的就可以了
    (为什么一定是最小的呢?因为你最大的不用,给别的用也一样,别的要是只能用最小的,给他也没有意义,不如不给)。
  4. 所以我们取左右端点,判断当前最大最小是不是可以组队,不能组就缩右边,能就两边一起缩。

打代码哈:
  1. 我们先保存价值的数组。
  2. 然后排个升序。
  3. 然后左右区间进行操作就行了。
  4. 看代码哈~


AC代码

#include <iostream> 
#include <algorithm>
using namespace std; 
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); 
//代码预处理区 

const int INF = 0x3f3f3f3f;
const int MAX = 3e4 + 7; 
int w, n, val[MAX];
//全局变量区 

int main() { 
    IOS;
    cin >> w >> n;
    for (int i = 1; i <= n; i++) cin >> val[i];
    sort(val + 1, val + 1 + n);
    int l = 1, r = n, cnt = 0;
    while (l < r) {
        if (val[l] + val[r] <= w) l++;//这一对可以用,小的就也用上了
        r--;
        cnt++;
    }
    if (l == r) cnt++;
    cout << cnt << endl;
    return 0; 
}
//函数区
牛客算法竞赛入门课题解 文章被收录于专栏

憨憨的专栏

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
04-19 18:50
已编辑
长沙学院 Java
个人背景:学院二本计科专业&nbsp;大二开始实习个人经历:安克创新&nbsp;、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps:&nbsp;很多人会问我学习路线和经验&nbsp;但是就像我上面说的&nbsp;我的实习过程靠的很多是关键节点的运气&nbsp;技术上面我可能不如很多人&nbsp;&nbsp;所以请大家理性求助和理性参考我的回答&nbsp;附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务