bzoj1816 扑克牌 贪心(不用二分QvQ)
我们发现,拥有的牌的种类越多,对我们越有利。
所以想一想暴力策略,就是选出所有牌堆中最少的那一堆,用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(nlogn)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)相关推荐
- 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划
洛谷4951 地震 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #define ...
- 算法训练一(贪心、二分)(含解题思路)(上)
目录 7-1最少失约(贪心) AC代码: 7-2删数问题(贪心) 7-3区间覆盖(贪心) AC代码: 7-7加油站之最小加油次数(贪心+优先队列) AC代码: 7-8求解删数问题(贪心) AC代码: ...
- 算法训练一(贪心、二分)(含解题思路)(下)
目录 7-15种树(贪心) AC代码: 7-16会场安排问题(贪心) AC代码: 7-17最优合并问题(贪心) AC代码: 7-18简简单单的数学题(位运算 + 哈希表) AC代码: 7-19h148 ...
- 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)
数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...
- POJ3122贪心或者二分(分蛋糕)
题意: m+1个人来分n个蛋糕,每个人分到的蛋糕数必须一样而且还必须是同一个蛋糕上的,问每个人最多分多少蛋糕? 思路: 能想到的方法有两种,一个是直接贪心,另一个就是二分,这个 ...
- Asia Yokohama Regional Contest 2018 K题 - Sixth Sense(思维加贪心加二分)
https://codeforces.com/gym/102082 题意 两个人玩n轮游戏,每次两个人各取一个数,并且已知对手的取数顺序,如果你取的数比他大就算赢一轮,求能赢最多轮次的取法,如果有多种 ...
- F. Gourmet and Banquet(贪心加二分求值)
题目链接:http://codeforces.com/problemset/problem/589/F A gourmet came into the banquet hall, where the ...
- hihocoder216周:贪心或二分
题目链接 有N条线段,要切K刀,使得最长的线段尽量短.在最佳切割的条件下,切完之后最长的那根绳子是多长. 方法一:贪心 每次切的那一刀必然是最长的那条线段,用优先队列,每次往最长的那条线段上切一刀 方 ...
- CF1579G - Minimal Coverage(DP,贪心,二分)
文章目录 CF1579G - Minimal Coverage 题目描述 分析 做法1:DP 做法2:贪心(bitset优化+二分 CF1579G - Minimal Coverage 题目描述 给出 ...
最新文章
- pycharm如何在程序运行后查看变量的值,变量的类型(不通过print和debug的方式)
- 并发编程之 Java 内存模型 + volatile 关键字 + Happen-Before 规则
- Linux下串口编程入门
- C++学习19 类的多继承
- IDEA添加eclispe的项目,需要把对应的文件夹设置成对应的资源
- 基于 Sentry Hive 权限控制命令详解
- HDU杭电2066 - 一个人的旅行(Dijkstra算法)
- 结构类型需要重载GetHashCode和Equals
- 软件_聚合搜索引擎[博]
- java 中webservice
- 学术|浅谈语音识别、匹配算法和模型
- vuejs+webpack环境搭建
- 微信聊天小程序——(四、聊天页面)
- matlab simulink汽车巡航时的速度模糊pid控制
- 已解决-NVIDIA安装程序失败-win10
- WMTS服务及地图瓦片原理
- python任务栏通知区域_PyQT实现通知区域图标和对话气泡
- 数据科学家和人工智能职业生涯之外软件公司之外的热门市场
- 密码锁屏保护隐私更安全,这款口碑好的手机浏览器值得拥有
- 什么是数据科学?数据科学的基本内容
热门文章
- 虚拟机vmware网络电缆被拔出问题解决
- [渝粤教育] 武汉学院 大学生心理健康教育 参考 资料
- 武汉大学计算机学院优秀大学生夏令营,武汉大学计算机学院2015年优秀大学生暑期夏令营活动实施方案...
- Oracle数据库 数据库调优
- TC SRM590 p1000
- 自定义starter为什么要加上spring.factories
- PDF转PPT?只需这两种方法,轻松完成转换
- xtwpro2编程器_xtw100编程器软件
- 为什么merge的时候要用squash
- Ansys专题仿真分析全套视频教程