2020小米网络赛第一场 F.Design Problemset(二分)

2024-04-15 23:32

本文主要是介绍2020小米网络赛第一场 F.Design Problemset(二分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
题意:
k k k种数,每种数有 b [ i ] b[i] b[i]个,每次选择的范围数目为 [ l i , r i ] [l_i,r_i] [li,ri],选择完的数字下次不能再选。
每次选择完毕后,数目总数范围要求在 [ L , R ] [L,R] [L,R]内,求一共能选择多少次。

思路:
直接二分能选择 m i d mid mid次,算出选择这么多次得到的最小值(每次取左端点就是最小值),最大值。如果最小值就在 [ L ∗ m i d , R ∗ m i d ] [L*mid,R*mid] [Lmid,Rmid]内,那就直接用。
如果最小值小于 L ∗ m i d L*mid Lmid且最大值大于等于 [ L ∗ m i d , R ∗ m i d ] [L*mid,R*mid] [Lmid,Rmid],那也可以。

因为本题中0的存在,所以导致结果可以很大,这个过程会爆longlong,应该可以分类讨论避免爆的情况。不过我偷懒直接使用了__int128。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>using namespace std;typedef long long ll;const int maxn = 1e5 + 7;
struct Node {ll l,r;
}a[maxn];
ll b[maxn];
int k;
ll L,R;bool check(ll mid) {__int128 mi = 0,mx = 0;for(int i = 1;i <= k;i++) {if(b[i] < (__int128)a[i].l * mid) return false;mi += (__int128)a[i].l * mid;mx += min((__int128)a[i].r * mid,(__int128)b[i]);}if(mi >= (__int128)L * mid && mi <= (__int128)R * mid) return true;if(mi < (__int128)L * mid && mx >= (__int128)L * mid) return true;return false;
}
int main() {scanf("%d%lld%lld",&k,&L,&R);for(int i = 1;i <= k;i++) {scanf("%lld",&b[i]);}for(int i = 1;i <= k;i++) {scanf("%lld%lld",&a[i].l,&a[i].r);}ll l = 0,r = 1e18;ll ans = 0;while(l <= r) {ll mid = (l + r) >> 1;if(check(mid)) {ans = mid;l = mid + 1;} else {r = mid - 1;}}printf("%lld\n",ans);return 0;
}

这篇关于2020小米网络赛第一场 F.Design Problemset(二分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907225

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

poj 3104 二分答案

题意: n件湿度为num的衣服,每秒钟自己可以蒸发掉1个湿度。 然而如果使用了暖炉,每秒可以烧掉k个湿度,但不计算蒸发了。 现在问这么多的衣服,怎么烧事件最短。 解析: 二分答案咯。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <c

poj 3258 二分最小值最大

题意: 有一些石头排成一条线,第一个和最后一个不能去掉。 其余的共可以去掉m块,要使去掉后石头间距的最小值最大。 解析: 二分石头,最小值最大。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <c

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~