这个问题我一开始没做出来,参考了https://blog.csdn.net/a1097304791/article/details/87874948#t3 和 https://www.cnblogs.com/albert67/p/10414426.html|
之后才会做,我就权当记录一下,并且再理一下思路吧:

收获:1:二分查找在数据量较大的有序数据中的优化作用;

2:思维题模摸门道

本题思路:枚举天数判断那一天能喝完且最少,可用二分查找优化。

思维上有问题的可能是:咖啡因在一天多次时的损耗-1、-2等不管是先喝咖啡因多得还是咖啡因少的都是一样的,多的-1和少的-1是一样的;所以不管你是正序排列还是逆序排列答案都是一样的;

我加了些注释:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;typedef  long long LL;
const int maxn = 210000;int n, m, arr[maxn];
bool cmp(int a, int b) { return a > b; }
bool check(int x)
{ LL sum = 0;for (int i = 1, t = 0; i <= n; i++) {sum += ( arr[i] - t );if (i%x == 0) t++;    //这里用得很好, 表示每组为x天if (arr[i] <= t) break;  //剪枝:i再增加,arr[i]也不会增加了,可以加速了}/*int k = 1;int t = 0;for (int i = 1; i <= n; ++i){if (k == x)break;if (arr[i] - t <= 0){k++;t = 1;--i;}sum += arr[i] - t;t++;}*/return sum >= m;
}
int main()
{cin >> n >> m;for (int i = 1; i <= n; i++)cin >> arr[i];sort(arr + 1, arr + 1 + n, cmp);int l = 1, r = n + 1, ans = 1 << 30;//有可能完不成/*二分查找的作用在于快速找到最少的可以完成的天数*/while (l < r) {int mid = ( l + r ) / 2;if (check(mid))r = mid, ans = min(ans, mid); //能完成,所以看看能不能天数再少点elsel = mid + 1; //完不成,所以天数加一天}if (ans != 1 << 30) cout << ans << endl;else cout << "-1" << endl;return 0;
}

Coffee and Coursework相关推荐

  1. Codeforces - 1118D2 - Coffee and Coursework (Hard Version) - 二分

    https://codeforces.com/problemset/problem/1118/D2 也是很好想的一个二分啦. 验证m的可行性的时候,肯定是把最多咖啡因的咖啡先尽可能平均分到每一天,因为 ...

  2. D1. Coffee and Coursework (Easy version) and D2. Coffee and Coursework (Hard Version)

    http://codeforces.com/contest/1118/problem/D1 http://codeforces.com/contest/1118/problem/D2 题意:有n杯咖啡 ...

  3. Codeforces Round #540 (Div. 3) D. Coffee and Coursework 二分

    题解 题目大意,有若干杯咖啡,每杯咖啡有一个收益a[i],不限制每天喝多少杯,但是每天的第k杯收益会减少k-1,问总收益大于n的所需最少天数. 使用二分答案求解,每次喝肯定是挑剩余最大的去喝,chec ...

  4. 【Codeforces 1118D1】Coffee and Coursework (Easy version)

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 从小到大枚举天数. 然后贪心地,从大到小分配a[i]到各个天当中. a[n]分配到第1天,a[n-1]分配到第2天,...然后a[n-x]又分 ...

  5. codeforces(D2. Coffee and Coursework (Hard Version))二分答案

    这题一看很容易想到二分,但我一开始想偏了,我是想枚举天数,然后二分去验证天数是否满足,但是这样二分验证天数是否满足这一步卡住了,写不出来. 然后我改成二分天数,验证天数是否满足这一步改成暴力计算,这样 ...

  6. Codeforces Round #540 (Div. 3) Coffee and Coursework

    由于我是直接写的hard版本的,而hard版本和easy版本只有数据范围的差距,所以在此只阐述hard版本的题解(easy版也能过,但是easy的数据范围应该还有其他方法可以偷跑过去) 假设x天可以完 ...

  7. D2. Coffee and Coursework (Hard Version)(思维+贪心)

    https://codeforces.com/problemset/problem/1118/D2 思路: 第一眼能看出答案能二分把.然后这题和前缀和不同,虽然每次减的是固定的,但是前缀先加起来会减出 ...

  8. Codeforces Round #540 (Div. 3) A,B,C,D2,E,F1

    A. Water Buying 链接:http://codeforces.com/contest/1118/problem/A 实现代码: #include<bits/stdc++.h> ...

  9. Codeforces Round #540 (Div. 3)(部分题解)

    链接:http://codeforces.com/contest/1118 来源:Codeforces 文章目录 A. Water Buying B. Tanya and Candies(前缀和) D ...

最新文章

  1. axmath公式编辑器
  2. 技术战“疫”,贾扬清、李飞飞要给程序员直播讲AI技术!
  3. java 工厂模式 计算器_简单工厂模式实现简易计算器
  4. 中国蚁剑 代码解压出错:【object Object】解决方法
  5. 前端学习(1486):postman测试接口
  6. 基于Docker搭建Gitlab代码存储
  7. 使用tableView崩溃
  8. 图的定义与术语 - 数据结构和算法54
  9. P8U8 最中听的话,不要做每件事都考虑太多。
  10. ITIL 4 Foundation知识体系-第一章-介绍
  11. linux系统如何备份系统软件,Linux系统如何备份
  12. Unity UnityWebRequest使用方法
  13. linux无线网卡信道,linux如何列出网卡支持的wifi信道?
  14. 还在用 ZXing ? 试试华为统一扫码服务吧!
  15. html 让360浏览器兼容模式,360浏览器兼容模式怎么设置?360浏览器兼容模式设置方法介绍...
  16. IMX6UL GPIO复用
  17. 北航计算机网络安全,李舟军
  18. 安装配置CentOS
  19. Java运算符(1)
  20. Leetcode算法题每日一练

热门文章

  1. 连接校园网的路由器为啥老是服务器没响应,校园网路由器不能使用怎么办?
  2. Android StatusBar 黑底白字
  3. 甜甜用计算机计算1050,NVIDIA GTX 1050/1050 Ti发布:75W功耗、取代GTX960
  4. 2013年10月17日_羊豆豆_新浪博客
  5. Angular4 去掉url中的#,并解决刷新时的404问题
  6. Flash鼠绘入门第十一课:可爱瓢虫的绘制-Flash鼠绘可爱瓢虫3
  7. python-短网址批量还原
  8. 【移动端】手机界面的设计尺寸
  9. 三阶魔方CFOP复原的C语言算法
  10. 【学习笔记】C++ 核心编程(二)类和对象——封装