P1182 数列分段`Section II` P1316 丢瓶盖 二分答案
题目描述
对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小。
关于最大值最小:
例如一数列4 2 4 5 142451要分成33段
将其如下分段:
[4 2][4 5][1][42][45][1]
第一段和为66,第22段和为99,第33段和为11,和最大值为99。
将其如下分段:
[4][2 4][5 1][4][24][51]
第一段和为44,第22段和为66,第33段和为66,和最大值为66。
并且无论如何分段,最大值不会小于66。
所以可以得到要将数列4 2 4 5 142451要分成33段,每段和的最大值最小为66。
输入输出格式
输入格式:
第11行包含两个正整数N,M。
第22行包含NN个空格隔开的非负整数A_iAi,含义如题目所述。
输出格式:
一个正整数,即每段和最大值最小为多少。
输入输出样例
说明
对于20\%20%的数据,有N≤10N≤10;
对于40\%40%的数据,有N≤1000N≤1000;
对于100\%100%的数据,有N≤100000,M≤N, A_iN≤100000,M≤N,Ai之和不超过10^9109。
题目都很水
规范二分写法!!!
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 214748347
#define N 100005
int a[N]; int main()
{
int n,k;
RII(n,k);
int R=;
int L=;
rep(i,,n)
{
RI(a[i]);R+=a[i];
L=max(L,a[i]);
}
while(L<R)
{
int mid=(L+R)>>; int cnt=;
int temp=;
rep(i,,n)
{
temp+=a[i];
if(temp>mid)
cnt++,temp=a[i];
}
if(temp)cnt++; if(cnt>k)L=mid+;
else R=mid;//答案求的是最小值 所以当有=时右往左靠
}
cout<<L;
return ;
}
题目描述
陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?
输入输出格式
输入格式:
第一行,两个整数,A,B。(B<=A<=100000)
第二行,A个整数,分别为这A个瓶盖坐标。
输出格式:
仅一个整数,为所求答案。
输入输出样例
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 214748347
#define N 100005
ll a[N];
int n,k;
bool check(ll x)//x为最近距离
{
int cnt=;
int temp=;
rep(i,,n)
{
if(a[i]-a[temp]>=x)
cnt++,temp=i;
}
return cnt>=k;
}
int main()
{
RII(n,k);
rep(i,,n)
cin>>a[i]; sort(a+,a++n);
ll R=a[n]-a[];
ll L=;
ll ans=;
while(L<=R)
{
ll mid=(L+R)>>;
if(check(mid))L=mid+,ans=max(ans,mid);
else R=mid-;
}
cout<<L-;
return ;
}
其他写法:
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 214748347
#define N 100005
ll a[N];
int n,k;
bool check(ll x)//x为最近距离
{
int cnt=;
int temp=;
rep(i,,n)
{
if(a[i]-a[temp]>=x)
cnt++,temp=i;
}
return cnt>=k;
}
int main()
{
RII(n,k);
rep(i,,n)
cin>>a[i]; sort(a+,a++n);
ll R=a[n]-a[];
ll L=;
ll ans=;
while(L<R)
{
ll mid=(L+R+)>>;
if(check(mid))L=mid;
else R=mid-;
}
cout<<L;
return ;
}
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 214748347
#define N 100005
ll a[N];
int n,k;
bool check(ll x)//x为最近距离
{
int cnt=;
int temp=;
rep(i,,n)
{
if(a[i]-a[temp]>=x)
cnt++,temp=i;
}
return cnt>=k;
}
int main()
{
RII(n,k);
rep(i,,n)
cin>>a[i]; sort(a+,a++n);
ll R=a[n]-a[];
ll L=;
ll ans=;
while(L<=R)
{
ll mid=(L+R)>>;
if(check(mid))L=mid+;
else R=mid-;
}
cout<<L-;
return ;
}
P1182 数列分段`Section II` P1316 丢瓶盖 二分答案的更多相关文章
- P1182 数列分段Section II
P1182 数列分段Section II 题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 ...
- 洛谷 P1182 数列分段 Section II
洛谷 P1182 数列分段 Section II 洛谷传送门 题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. ...
- luogu P1182 数列分段Section II
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- 洛谷 P1182 数列分段Section II Label:贪心
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- P1182 数列分段`Section II`
传送门 思路: 求数列每段和的最大值的最小值,很明显是用二分法求解,加贪心检验.本题关键是要怎么去高效的check,可以考虑一个贪心的思路,能加的就加上,不能则新开一段,so对于二分的值 u ,我们从 ...
- P1182 数列分段`Section II` 二分
https://www.luogu.org/problemnew/show/P1182 做了这个题才知道二分的强大 这个题可以假设我们有n个果子 m个容器 要能把果子全装进去 那么容器最小可以是多小 ...
- P1182 数列分段`Section II`(贪心+二分, 好题)
这道题让我见识了二分的新姿势.本来,我是二分的位置的. 思路:直接二分答案x, 关键是检验函数的写法: 先用前缀和 a[i....], 看满足多少段满足 a[ j ]-a[ i ]<=x; 的注 ...
- 洛谷 P1182 数列分段`Section II`【二分答案】
[代码]: #include<bits/stdc++.h> const double eps = 1e-8; const int maxn = 1e6+5; #define inf 0x3 ...
- luogu P1316 丢瓶盖 |二分答案
题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入格式 ...
随机推荐
- 前端 -----jQuery的事件绑定和解绑
11-jQuery的事件绑定和解绑 1.绑定事件 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (S ...
- 前端 ----jQuery操作表单
05-使用jQuery操作input的value值 表单控件是我们的重中之重,因为一旦牵扯到数据交互,离不开form表单的使用,比如用户的注册登录功能等 那么通过上节知识点我们了解到,我们在使用j ...
- [HTTP] 基本认证的工作流程
HTTP的基本认证涉及两个字段,一个是请求字段 Authorization: Authorization: Basic xxx 一个是响应字段 WWW-Authenticate WWW-Authent ...
- windows修复分区卷:chkdsk
问题描述: 共享磁盘上传文件到服务器报错:一个意外错误使你无法复制该文件夹.如果你继续收到此错误,可以使用错误代码来搜索有关问题的帮助,错误 0x800703E3:由于线程退出或应用程序请求,已终止I ...
- Cropper.js使用笔记
官网:https://fengyuanchen.github.io/cropperjs/ github:https://github.com/fengyuanchen/cropperjs 由于文档不好 ...
- Windows下Oracle 11g安装以及创建数据库
安装数据库 事实上Oracle安装 1.安装准备 Oracle的安装包下载以后是两个压缩包,同时选中两个压缩包右击进行解压 2.解压完成如下图所示 3.双击 setup.exe 文件进行安装,会弹出以 ...
- vue 树状图数据的循环 递归循环
在main.js中注册一个子组件 在父组件中引用 树状图的数据格式 绑定一个数据传入子组件,子组件props接收数据 子组件中循环调用组件,就实现了递归循环
- 基于vue-cli3的vue项目移动端样式适配,lib-flexible和postcss-px2rem
1,安装 flexible和 postcss-px2rem(命令行安装) npm install lib-flexible --save npm install postcss-px2rem --sa ...
- Question Of AI Model Training
1 模型训练基本步骤 准备原始数据,定义神经网络结构及前向传播算法 定义loss,选择反向传播优化算法 生成Session,在训练数据进行迭代训练,使loss到达最小 在测试集或者验证集上对准确率进行 ...
- laravel 更新验证
public function update(Request $request, User $user) { // 验证规则. $rules = [ 'email' => [ 'nullable ...