3241 小明和他的同学们

小明在全球数学竞赛获得了冠军,他很高兴,所以他想请他的同学吃巧克力,但是小明每天都很忙,只有x分钟的时间可以宴请同学们,现在小明有m个巧克力,小明要请n个同学吃巧克力,每个同学吃一块巧克力的时间都不一样,有的同学吃的快,有的同学吃的慢,每个同学吃完一块巧克力之后,马上就会去吃另外一个巧克力,假如2个人同时吃完,优先发给吃的快的同学。直到没有剩余的巧克力或者宴请时间结束了。

现在小明想要知道在宴请结束之后有几块巧克力被吃完,有几块巧克力没有被吃完,但是被吃了一些,聪明的你可以帮助小明解决这个问题吗?

注意,如果两个人同时吃完当前巧克力,那么吃的快的同学优先得到巧克力。

其中1<= n<=100,1<=m<=5000,1<=x<=1000,1<=t<=20,1<=每个同学吃一块巧克力的时间<=1000。

输入

第一行包括一个t,表示测试样例的个数;
对于每个测试样例:
第一行包括三个整数n,m,x,表示有n个同学,m个巧克力,x分钟的宴请时间;
第二行包括n个整数,每个整数表示该同学吃一块巧克力的时间。

输出

每个测试样例输出一行,每行包括两个整数 a,b,表示a块巧克力被完整吃完,b块巧克力
被吃了但是没有被完整吃完。

数据范围

对于10%的数据,1<= n<= 4;
对于100%的数据,1<= n<=100,1<=m<=5000,1<=x<=1000,1<=t<=20,1<=每个同学吃
一块巧克力的时间<=1000。

输入样例

3
1 2 1
1
3 8 5
1 3 4
5 4 1
5 4 3 2 1

输出样例

1 0
7 1
1 3

解析:

题目里面描述 n 个同学是一起开始吃巧克力的,吃完一个随即就去吃剩下的,那么这就可以用优先队列模拟 n 个同学吃巧克力的过程,每次取出吃最快的那个同学,之后把当前巧克力给他。

同时吃完优先分给更快的同学。终止条件为吃完 m 个巧克力或者每个同学都用时都大于等于 x ,最后在统计一下每个同学最后吃的那个巧克力是否吃完即可,时间复杂度 O(t×mlogn)。

需要注意的是,本题不用优先队列并没有很好的解法,看起来似乎可以用 x/ti 来计算每个同学吃的数量(ti 为同学 i 吃巧克力所用的时间),但我们思考,可能在他能够拿到最后一块巧克力之前,所有巧克力已经被分完了,并且这些被分掉的巧克力,未必都能够吃完。

放代码:

#include <bits/stdc++.h>
using namespace std;
int T, n, m, x, ansx, ansy, a[200];
priority_queue<pair<int, int> > p, q;
int main() {scanf("%d", &T);while(T --) {ansx = ansy = 0;while(!q.empty()) q.pop();while(!p.empty()) p.pop();scanf("%d %d %d", &n, &m, &x);for(int i = 1; i <= n; i ++) {scanf("%d", &a[i]);q.push(make_pair(-a[i], i));}for(int j = 1, k = min(n, m); j <= k; j ++, m --) {p.push(make_pair(q.top().first, q.top().second));   q.pop();ansy ++;}for(int i = 1; i <= x;i++) {  while(!p.empty() && -p.top().first==i) {ansy --, ansx ++;  int y = p.top().second;p.pop(), q.push(make_pair(-a[y], y));}for(int j = 1, k = min(n, m); j <= k && x - i > 0 && !q.empty();j++,m--) {p.push(make_pair(-(i + (-q.top().first)), q.top().second));q.pop();ansy ++;}}printf("%d %d\n", ansx, ansy);}
}

51nod3241 小明和他的同学们相关推荐

  1. 【51nod 3241】【堆】小明和他的同学们

    小明和他的同学们 题目 解题思路 Code 51nod 3241 小明和他的同学们 题目 小明在全球数学竞赛获得了冠军,他很高兴,所以他想请他的同学吃巧克力,但是小明每天都很忙,只有x分钟的时间可以宴 ...

  2. 【51 Nod】3241 小明和他的同学们【堆】

    解题思路 一开始想过贪心,用 t/吃一个的时间,算出每个人能吃多少个整的,然后发现不行,因为当一个同学拿下一块时,不知道是否还有剩余,要知道谁先拿也很麻烦. 所以考虑--暴力吧! 直接用一个优先队列模 ...

  3. 小明去参加一个同学的生日聚会,同学的家长规定18岁以上的同学才可以饮酒

    //选择结构流程及应用  #include"stdio.h"                                                /*编译预处理命令*/  ...

  4. Java 小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码

    题目:小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求: 1. 密码只能由大写字母,小写字母,数字构成: 2. 密码不能以数字开头: ...

  5. zzuli oj 1122 小明同学的调查作业

    题目描述:  小明的老师布置了一份调查作业,小明想在学校中随机找N个同学一起做一项问卷调查,聪明的小明为了实验的客观性, 他先随机写下了N个1到1000之间的整数(0<N≤1000),不同的数对 ...

  6. 20161128 已知小明同学其中考试成绩,数学97.5分,语文94.5分,英语95.5分,求小明同学的三科总成绩(结果保留一位小数)。...

    题目: 已知小明同学其中考试成绩,数学97.5分,语文94.5分,英语95.5分,求小明同学的三科总成绩(结果保留一位小数). 代码: 1 program work20161128; 2 var 3 ...

  7. 寒假的时候,小明同学要去拜访很多朋友,恰巧他所有朋友的家都处在坐标平面的X轴上。小明可以任意选择一个朋友的家开始访问,但是每次访问后他都必须回到出发点,然后才能去访问下一个朋友。

    寒假的时候,小明同学要去拜访很多朋友,恰巧他所有朋友的家都处在坐标平面的X轴上.小明可以任意选择一个朋友的家开始访问,但是每次访问后他都必须回到出发点,然后才能去访问下一个朋友. 比如有4个朋友,对应 ...

  8. 假如小明今年第1季度的三个月中的营业额分别是{5,10,15},第二季度他计划要把第1季度中每个月的营业额都提升为2倍,请你帮小明同学计算出他第二季度的每个月营业额;

    1. 训练描述 假如小明今年第1季度的三个月中的营业额分别是{5,10,15},第二季度他计划要把第1季度中每个月的营业额都提升为2倍,请你帮小明同学计算出他第二季度的每个月营业额; 要求: 1.第二 ...

  9. 2022-01-26:最优账单平衡。 一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x

    2022-01-26:最优账单平衡. 一群朋友在度假期间会相互借钱.比如说,小爱同学支付了小新同学的午餐共计 10 美元.如果小明同学支付了小爱同学的出租车钱共计 5 美元.我们可以用一个三元组 (x ...

最新文章

  1. Installation error: INSTALL_FAILED_VERSION_DOWNGRADE
  2. Mysql 瓶颈优化
  3. Linux命令详解----iostat
  4. React jsx转换成原生JavaScript的一个例子
  5. ajax 请求post和get,ajax请求get和post
  6. 卡尔曼_卡尔曼滤波最完整公式推导
  7. 一文看懂Java虚拟机——JVM基础概念整理
  8. [msi]启动msi日志记录
  9. 如何查看CSND私密文章
  10. Android编程入门很简单pdf
  11. C语言_结构体数组初始化
  12. 如何使用思维导图?思维导图绘制方法介绍
  13. c语言中常用运算符号
  14. 【CANdelaStudio编辑CDD】-0.3-CDD中Fault Memory里DTC Column与Autosar Dem对应关系
  15. The Top 5 cloud security threats presented by Mark Russinovich
  16. 我把淘宝当副业,一年全款买了房:你看不起的行业,真的很赚钱
  17. 7-12 个位数字统计 (15 分)
  18. 【算法模板】DFS秒杀模板—附练习题(阳光号启航)
  19. 测试老鸟都在用的接口抓包常用工具以及接口测试工具都有哪些?
  20. Ubuntu 下编写C程序

热门文章

  1. Altium Designer使用技巧总结
  2. GAU-α:尝鲜体验快好省的下一代Attention
  3. QPS和TPS是什么?
  4. 自媒体,如何提高文章曝光率?
  5. sw转urdf详细步骤
  6. 889-Linux主机网络流量抓包监控
  7. ubuntu容器下时区修改方法
  8. 通过雪花(snowflake)算法用Python实现一个简单的发号器
  9. vmware缩写涵义
  10. 小班安全优质课教案《防止拥挤踩踏事故》