题目链接:

https://codeforces.com/contest/1165/problem/F2

题意:

需要买$n$种物品,每种物品$k_i$个,每个物品需要两个硬币

每天获得一个硬币

有$m$个优惠

在$d_i$天,$t_i$物品卖一个硬币

求购买所需物品最少需要的天数

数据范围:

$1 \le n, m \le 2 \cdot 10^5$

分析:

我们可以注意到,如果某天是某个物品的最后优惠时间,那么我们一定要在这天尽可能多地购买这个物品

对答案进行二分

再二分得到每个物品在这个答案下的最后优惠时间

贪心购买每种物品

复杂度$O(lgn*lgn*n)$

ac代码:

#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
using namespace std;
const int maxn=2e5+10;
const ll mod=998244353;
vector<int>ve[maxn];
int sale[maxn*10],sum,num[maxn],n,m;
bool check(int day)//检查天数为day时,能不能买完所以需要的东西
{
for(int i=1;i<=day;i++)sale[i]=0;//购买最后期限为i的物品数量
for(int i=1;i<=n;i++)
{
if(ve[i].size()==0)continue;
int st=0,en=(int)ve[i].size()-1;//二分每种物品的最后期限
while(st!=en)
{
int md=(st+en)/2;
if(ve[i][md+1]<=day)st=md+1;
else en=md;
}
sale[ve[i][st]]+=num[i];
}
int money=0,buy=0;
for(int i=1;i<=day;i++)//只要是最后期限,那么这个物品我们就买最多
{
money++;
buy+=min(money,sale[i]);
money-=min(money,sale[i]);
}
if(money>=2*(sum-buy))return 1;
else return 0;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
sum+=num[i];
}
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d %d",&a,&b);
ve[b].push_back(a);
}
for(int i=1;i<=n;i++)
sort(ve[i].begin(),ve[i].end()); int st=sum,en=2*sum;//对答案二分
while(st!=en)
{
int md=(st+en)/2;
if(check(md))en=md;
else st=md+1;
}
printf("%d\n",st);
return 0;
}

  

最新文章

  1. 20个JS优化代码技巧
  2. Linux从零单排(一):Google Chrome的安装
  3. 事件委托和JQ事件绑定总结
  4. 4G基站如何查询
  5. php开启mysqli扩展之后如何连接数据库
  6. WPF点补间、拟合回归直线
  7. AngularJS 指令(使浏览器认识自己定义的标签)
  8. Python入门笔记(15):对文件的操作(1)
  9. 【SDOI2008】解题汇总
  10. android 在应用中切换语言
  11. 转载 - LINUX下查看CPU使用率的命令
  12. queue 与 vector
  13. OS X 使用技巧——轻松地调整窗口大小
  14. redis的hash操作在集中式session中的应用
  15. Linux系统下分割tomcat日志
  16. Windows下命令行直接编译程序
  17. multipath多路径实验02-配置多路径软件
  18. (译)ABP之Entities
  19. Python深度学习(Deep Learning with Python) 中文版+英文版+源代码
  20. Foxmail设置IMAP和STMP服务器

热门文章

  1. 怎样写一个 &quot;Hello, World!&quot;
  2. codeforce B. Petya and Exam
  3. String s=new String(&quot;xyz&quot;);创建了几个String Object?二者之前的区别是什么?
  4. Jenkins服务器安装与配置
  5. UESTC 2016 Summer Training #1 J - Objects Panel (A) 按条件遍历树
  6. Airtest 支持的手机,系统等环境
  7. vue.js 父子组件间 props 数据同步处理
  8. ThreadPoolExecutor源码分析二
  9. C# MVC 视图 计算某一个列的总和
  10. c#系统泛型委托