我们发现,拥有的牌的种类越多,对我们越有利。

所以想一想暴力策略,就是选出所有牌堆中最少的那一堆,用Jocker代替,否则取一张,不断进行本操作。

而你发现这样取着取着,就会有很多牌堆里的牌张数一样了,并且一定是初始最少的牌的张数会变得一样。

假设前iii堆已经变得张数一样了,那么我们考虑在前iii堆每一堆上加一张Jocker,然后取iii次将加进去的Jocker取完,这叫做一组操作。每做完一组操作,前iii堆各少i−1i-1i−1张牌,后n−in-in−i堆每堆少iii张牌,所以做ci+1−cic_{i+1}-c_ici+1​−ci​组后,前i+1i+1i+1堆的牌张数就一样了。

于是我们这么贪心的取即可,当然取的过程中,可能因为两个限制无法正好做ci+1−cic_{i+1}-c_ici+1​−ci​组操作,一个是Jocker的数量,一个是前iii堆每堆的牌的数量。

做完这些一组一组的操作后,再做每一堆取一张。所以你发现,假设最终受到限制导致只能做kkk组,做完kkk组后还剩一些Jocker,如果继续使用它们,并不能使答案更优,所以剩的那些Jocker也不用使用了。当然如果一直做到所有牌堆的牌数都相同了还有剩的Jocker,当然要用掉。

复杂度O(nlog⁡n)O(n \log n)O(nlogn),时间瓶颈在排序。

#include<bits/stdc++.h>
using namespace std;
#define RI register int
const int inf=0x3f3f3f3f;
int n,m,ans,orz,c[55],s[55];//s:差分记录牌的减少情况
int main()
{scanf("%d%d",&n,&m);for(RI i=1;i<=n;++i) scanf("%d",&c[i]);sort(c+1,c+1+n);for(RI i=1;i<n;++i) {int d=c[i+1]-c[i];if(d*i>m-ans) {int k=(m-ans)/i;if(d*(i-1)>c[i]-ans) k=min(k,(c[i]-ans)/(i-1));ans+=k*i,s[1]-=k*(i-1),s[i+1]+=k*(i-1),s[i+1]-=k*i;break;}else if(d*(i-1)>c[i]-ans) {int k=(c[i]-ans)/(i-1);ans+=k*i,s[1]-=k*(i-1),s[i+1]+=k*(i-1),s[i+1]-=k*i;break;}s[1]-=d*(i-1),s[i+1]+=d*(i-1),s[i+1]-=d*i;ans+=d*i;}orz=inf;for(RI i=1;i<=n;++i) s[i]+=s[i-1],c[i]+=s[i],orz=min(orz,c[i]);int k=min((m-ans)/n,orz/(n-1));ans+=k*n,orz-=k*(n-1);printf("%d\n",ans+orz);return 0;
}

bzoj1816 扑克牌 贪心(不用二分QvQ)相关推荐

  1. 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划

    洛谷4951 地震 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #define ...

  2. 算法训练一(贪心、二分)(含解题思路)(上)

    目录 7-1最少失约(贪心) AC代码: 7-2删数问题(贪心) 7-3区间覆盖(贪心) AC代码: 7-7加油站之最小加油次数(贪心+优先队列) AC代码: 7-8求解删数问题(贪心) AC代码: ...

  3. 算法训练一(贪心、二分)(含解题思路)(下)

    目录 7-15种树(贪心) AC代码: 7-16会场安排问题(贪心) AC代码: 7-17最优合并问题(贪心) AC代码: 7-18简简单单的数学题(位运算 + 哈希表) AC代码: 7-19h148 ...

  4. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  5. POJ3122贪心或者二分(分蛋糕)

    题意:        m+1个人来分n个蛋糕,每个人分到的蛋糕数必须一样而且还必须是同一个蛋糕上的,问每个人最多分多少蛋糕? 思路:      能想到的方法有两种,一个是直接贪心,另一个就是二分,这个 ...

  6. Asia Yokohama Regional Contest 2018 K题 - Sixth Sense(思维加贪心加二分)

    https://codeforces.com/gym/102082 题意 两个人玩n轮游戏,每次两个人各取一个数,并且已知对手的取数顺序,如果你取的数比他大就算赢一轮,求能赢最多轮次的取法,如果有多种 ...

  7. F. Gourmet and Banquet(贪心加二分求值)

    题目链接:http://codeforces.com/problemset/problem/589/F A gourmet came into the banquet hall, where the ...

  8. hihocoder216周:贪心或二分

    题目链接 有N条线段,要切K刀,使得最长的线段尽量短.在最佳切割的条件下,切完之后最长的那根绳子是多长. 方法一:贪心 每次切的那一刀必然是最长的那条线段,用优先队列,每次往最长的那条线段上切一刀 方 ...

  9. CF1579G - Minimal Coverage(DP,贪心,二分)

    文章目录 CF1579G - Minimal Coverage 题目描述 分析 做法1:DP 做法2:贪心(bitset优化+二分 CF1579G - Minimal Coverage 题目描述 给出 ...

最新文章

  1. pycharm如何在程序运行后查看变量的值,变量的类型(不通过print和debug的方式)
  2. 并发编程之 Java 内存模型 + volatile 关键字 + Happen-Before 规则
  3. Linux下串口编程入门
  4. C++学习19 类的多继承
  5. IDEA添加eclispe的项目,需要把对应的文件夹设置成对应的资源
  6. 基于 Sentry Hive 权限控制命令详解
  7. HDU杭电2066 - 一个人的旅行(Dijkstra算法)
  8. 结构类型需要重载GetHashCode和Equals
  9. 软件_聚合搜索引擎[博]
  10. java 中webservice
  11. 学术|浅谈语音识别、匹配算法和模型
  12. vuejs+webpack环境搭建
  13. 微信聊天小程序——(四、聊天页面)
  14. matlab simulink汽车巡航时的速度模糊pid控制
  15. 已解决-NVIDIA安装程序失败-win10
  16. WMTS服务及地图瓦片原理
  17. python任务栏通知区域_PyQT实现通知区域图标和对话气泡
  18. 数据科学家和人工智能职业生涯之外软件公司之外的热门市场
  19. 密码锁屏保护隐私更安全,这款口碑好的手机浏览器值得拥有
  20. 什么是数据科学?数据科学的基本内容

热门文章

  1. 虚拟机vmware网络电缆被拔出问题解决
  2. [渝粤教育] 武汉学院 大学生心理健康教育 参考 资料
  3. 武汉大学计算机学院优秀大学生夏令营,武汉大学计算机学院2015年优秀大学生暑期夏令营活动实施方案...
  4. Oracle数据库 数据库调优
  5. TC SRM590 p1000
  6. 自定义starter为什么要加上spring.factories
  7. PDF转PPT?只需这两种方法,轻松完成转换
  8. xtwpro2编程器_xtw100编程器软件
  9. 为什么merge的时候要用squash
  10. Ansys专题仿真分析全套视频教程