CF1132D Streessful Training(二分+贪心+优先队列*2300)

简介: CF1132D Streessful Training(二分+贪心+优先队列*2300)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
typedef long long ll;
using namespace std;
const int N = 3e5 + 10;
ll n, k;
ll a[N], b[N];
struct node {
  ll a;
  ll b;
  ll c;
  bool operator<(const node &w)const {
    return c > w.c;  //从堆底到根 从大到小 即 小根堆
  }
};
bool check(ll x) {
  priority_queue<node>q;
  for (int i = 1; i <= n; i++) {
    if (a[i] / b[i] < k)
      q.push({a[i], b[i], a[i] / b[i]});
  }
  if (q.empty()) return true;
  for (int i = 0; i < k; i++) {
    auto t = q.top();
    q.pop();
    if (t.c < i) return false;
    if ((t.a + x) / t.b  < k) {
      q.push({t.a + x, t.b, (t.a + x) / t.b });
    }
    if (q.empty()) return true;
  }
  return true;
}
int main() {
  scanf("%lld%lld", &n, &k);
  for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (int i = 1; i <= n; i++) scanf("%lld", &b[i]);
  //枚举最小答案
  ll l = 0, r = 3e12 + 10;
  bool f = 0;
  while (l < r) {
    ll mid = l + r >> 1;
    if (check(mid)) {
      r = mid;
      f = 1;
    } else l = mid + 1;
  }
  if (f == 1)
    cout << l << "\n";
  else cout << -1 << "\n";
  return  0;
}
目录
相关文章
Leetcode 368. Largest Divisible Subset思路及详解
这里有个很简单的数学性质,就是整除的传递性,如果a%b==0 且 b%c == 0,那么a%c == 0,说白了如果c是b的因子,b又是a的因子,那么c肯定是a的因子。这样我们就可以在数组中找出很多整除链(a->b->c->d,其中b是a的因子,c是b的因子,d是c的因子),这样的链条就满足两两整除的条件,题目就变成了求最长的链条。 先上代码,然后我再解释下我的代码。
47 0
【Hello Algorithm】暴力递归到动态规划(三)(上)
【Hello Algorithm】暴力递归到动态规划(三)
39 0
|
算法
The kth great number(小根堆思想,模板题)
The kth great number(小根堆思想,模板题)
49 0
The kth great number(小根堆思想,模板题)
|
人工智能
poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
所谓离散化,我们的了解就是对原数组排序,然后用所在位置的下标代替原数,这样我们就可以把数据范围缩小到1-500000,这个数组是开的下的。
44 0
|
机器人
【Hello Algorithm】暴力递归到动态规划(四)(上)
【Hello Algorithm】暴力递归到动态规划(四)
52 0
|
机器学习/深度学习
【Hello Algorithm】暴力递归到动态规划(一)(下)
【Hello Algorithm】暴力递归到动态规划(一)(下)
56 0
|
存储 容器
华为机试HJ41:称砝码(深度优先遍历dfs-Depth First Search)
华为机试HJ41:称砝码(深度优先遍历dfs-Depth First Search)
145 0
|
人工智能
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
|
算法 C++ Python
算法笔记(1)—— 搜索算法:线性搜索(LS)、二分搜索(BS)、记忆化搜索(MS)
算法笔记(1)—— 搜索算法:线性搜索(LS)、二分搜索(BS)、记忆化搜索(MS)
4001 0
51nod 1255 字典序最小的子序列 (贪心 + stack)
51nod 1255 字典序最小的子序列 (贪心 + stack)
94 0