二分与分治

目录:

二分:

P2440 木材加工

P1577 切绳子

P2678 [NOIP2015 提高组] 跳石头

分治:

P1228 地毯填补问题

CF1400E Clear the Multiset

P2440 木材加工

P2440 木材加工 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:直接二分即可,得算出能分成几段,然后比较这个段数与计划段数的大小

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int L[N];
int n,k;//n表示原木的数量,k表示小段的数量
int main()
{cin>>n>>k;for(int i = 1;i <= n;i++){cin>>L[i];}int l = 0,r = 0x3f3f3f3f;while(l+1 < r){int mid = (l+r)>>1;int cnt = 0;for(int i = 1;i <= n;i++)cnt += L[i]/mid;if(cnt >= k) l = mid;else r = mid;} cout<<l<<endl;return 0;
}

P1182 数列分段 Section II

P1182 数列分段 Section II - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:在实现的过程我们可以采用前缀和的思想,但是在这一题中我们可以用贪心的思想来解决

Ps:在这题的l要定义为大一点的那个数,因为我们需要输出的就是最大值,l刚好对应最小值

//P1182
//思路:题目中说要求最大值最小,所以果断套用二分模板
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int n,m,l,r;
bool check(int x)
{int tot = 0,sum = 0;for(int i = 1;i <= n;i++){if(tot+a[i] <= x)tot += a[i];else tot = a[i],sum++;//sum表示数哦,sum++意味着选择下一个数进行累加}return sum>=m;}
int main()
{scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++){cin>>a[i];l = max(l,a[i]);r += a[i];}while(l <= r){int mid = (l+r) >> 1;if(check(mid))l = mid+1;//分段数 > 指定分段次数 , 说明指定的和太小,应该让和大点,才能让分段次数少点,因此进入右区间left = mid + 1else r = mid-1;}printf("%d",l);return 0;
}

P1577 切绳子 

P1577 切绳子 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

//P1577
//思路:也是直接二分即可
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
double d[N];
int a[N];
int n,m,mxn,mn;
bool check(int x)
{int tot = 0;for(int i = 1;i <= n;i++)tot += a[i]/x;return tot>=m;}
int main()
{scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++){cin>>d[i];a[i] = (int)(d[i] * 100);}int l = 0,r = 0x3f3f3f3f;while(l <= r){int mid = (l+r) >> 1;if(mid == 0)break;//0不能作为除数if(check(mid))l = mid+1;//分段数 > 指定分段次数 , 说明指定的和太小,应该让和大点,才能让分段次数少点,因此进入右区间left = mid + 1else r = mid-1;}printf("%.2f",r / 100.0);return 0;
}

P2678 [NOIP2015 提高组] 跳石头 

P2678 [NOIP2015 提高组] 跳石头 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:从位置的小到大扫遍所有石头,用一个变量存储上一个跳到的点。第一个与这上一个点的距离大于等于x的石头即是下一个跳到的点。这里用了一点贪心的思想:因为如果不跳到第一个符合条件的点上,那么整个队列的稀疏度就会提高,最终需要删除的石头也会更多。因为我们要取最优状态,所以要保证跳过的石头数最少。当然,如果某个石头到终点的距离小于x,那它不能被统计到——所以得删去后面这些无法跳到的石头。(我就是少特判了这个玩意WA了好久)

//P2678
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int d,n,m,ans;
int a[N];
bool check(int x)
{int sum = 0,tot = 0;for(int i = 1;i <= n;i++){if(a[i] - tot < x)sum += 1;//表示被搬走石头的数量叠加else tot = a[i];}if(d-tot < x)sum+=1;//关键部分!!!!!警钟敲烂return sum <= m;
}
int main()
{scanf("%d%d%d",&d,&n,&m);for(int i = 1;i <= n;i++){cin>>a[i];}sort(a+1,a+1+n);int l = 0,r = d;while(l <= r){int mid = (l+r)>>1;if(check(mid)){ans = mid;l = mid+1;}else r = mid - 1;}printf("%d",ans);return 0;
}

P1228 地毯填补问题

P1228 地毯填补问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:

看图说话,一个2^k的可以分为2 ^ (k-1)的子问题

 找规律按照下图直接写代码即可!!!

我真的会谢!把l打成1的低级错误!!

//P1228
#include<bits/stdc++.h>
using namespace std;
void f(int x,int y,int gx,int gy,int l)
{if(l == 1)return;//先要确定障碍物在哪个区块//在这个区块的对应角放上一个障碍物//将原来的大块分为4个小块递归调用fif(gx <= x+l/2-1 && gy <= y+l/2-1){//左上角cout<<x+l/2<<" "<<y+l/2<<" "<<1<<endl;f(x,y,gx,gy,l/2);f(x,y+l/2,x+l/2-1,y+l/2,l/2);f(x+l/2,y,x+l/2,y+l/2-1,l/2);f(x+l/2,y+l/2,x+l/2,y+l/2,l/2);//这四步就是按照图来的}else if(gx <= x+l/2-1 && gy >= y+l/2){cout<<x+l/2<<" "<<y+l/2-1<<" "<<2<<endl;f(x,y,x+l/2-1,y+l/2-1,l/2);f(x,y+l/2,gx,gy,l/2);f(x+l/2,y,x+l/2,y+l/2-1,l/2);f(x+l/2,y+l/2,x+l/2,y+l/2,l/2);}else if(gx >= x+l/2 && gy <= y+l/2-1){cout<<x+l/2-1<<" "<<y+l/2<<" "<<3<<endl;f(x,y,x+l/2-1,y+l/2-1,l/2);f(x,y+l/2,x+l/2-1,y+l/2,l/2);f(x+l/2,y,gx,gy,l/2);f(x+l/2,y+l/2,x+l/2,y+l/2,l/2);}else if(gx >= x+l/2 && gy >= y+l/2){cout<<x+l/2 - 1<<" "<<y+l/2 - 1<<" "<<4<<endl;f(x,y,x+l/2-1,y+l/2-1,l/2);f(x,y+l/2,x+l/2-1,y+l/2,l/2);f(x+l/2,y,x+l/2,y+l/2-1,l/2);f(x+l/2,y+l/2,gx,gy,l/2);}
}
int k,x,y;
int main()
{cin>>k>>x>>y;f(1,1,x,y,pow(2,k));//(x,y)表示公主的坐标,pow(2,k)表示矩阵的大小 2^k的长度return 0;
}

CF1400E Clear the Multiset

CF1400E Clear the Multiset - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:题目说了要按两种操作

用操作一时:我们的 f(l,x-1)+f(x+1,r)+k

不用操作一的时候我们的最小操作次数是  r - l +1 

最后 我们两者综合起来取最小值即可

答案是f(1,n)

上代码!!

//CF1400E
#include<bits/stdc++.h>
using namespace std;
const int N = 5050;
int n;
int a[N];
int f(int l,int r)
{if(l > r) return 0;if(l == r)return min(a[l],1);int k = 0x3f3f3f3f;int x;for(int i = l;i <= r;i++)if(k > a[i]) k = a[i],x = i;for(int i = l;i <= r;i++)a[i] -= k;return min(r-l+1,f(l,x-1)+f(x+1,r)+k);
}
int main()
{cin>>n;for(int i = 1;i <= n;i++){cin>>a[i];}int cnt = f(1,n);cout<<cnt<<endl;return 0;
}

正睿OI补题(二分与分治)相关推荐

  1. 正睿OI补题(排序,高精度)

    排序,高精度 目录: P1017 [NOIP2000 提高组] 进制转换 P1908 逆序对 P1017 [NOIP2000 提高组] 进制转换 普及一下概念,负整数取模后是正整数取模的相反数,例如- ...

  2. 正睿OI补题(递归与递推,前缀和与差分)

    目录: P1255 数楼梯 P4552 [Poetize6] IncDec Sequence P2280 [HNOI2003]激光炸弹 P1350 车的放置 P1255 数楼梯 数楼梯 - 洛谷 递推 ...

  3. 正睿OI D班补题(模拟)

    9.26 模拟: P1557 Kruscal的加法 Kruscal的加法 - 洛谷 没过的代码不贴了,我真的服,这个后面再更.......

  4. 正睿OI DAY8 ks1

    DAY8 今天过得好快啊! 今天是考的试,好难Orz,说的是,t1,t2提高,t3省选,ε=(´ο`*))) 开始先想了两个半小时的T1,打了个暴力,但测试用的是捆绑测试(pei),反正很坑: 之后开 ...

  5. 正睿OI DAY12 ks5

    DAY 12 今天过得好快啊! 2333又有暴力分,T3提答题是第一次做. 开始T1以为是选择连续子段,后来就只写了个暴力DFS20pts,后来想怎么选择间断的子段,就没想到DP了·········· ...

  6. 『正睿OI 2019SC Day3』

    容斥原理 容斥原理指的是一种排重,补漏的计算思想,形式化的来说,我们有如下公式: \[\left | \bigcup_{i=1}^nS_i \right |=\sum_{i}|S_i|-\sum_{i ...

  7. 2019金华正睿集训总结

    emmm-蒟蒻第一次出来集训,也是2019年noip(现在应该叫csp的说)前最后一次外出集训- 感觉压力好大啊-毕竟才学了不到一年啊- 但不管怎样,接下来几天要好好加油啊! DAY1 仅自己用的链接 ...

  8. 11.2 正睿停课训练 Day15

    目录 2018.11.2 正睿停课训练 Day15 A 郁闷的小G(二分) B 小G的树(树形DP) C 数的距离(思路) 考试代码 B C 2018.11.2 正睿停课训练 Day15 时间:3.5 ...

  9. 8.10 正睿暑期集训营 Day7

    目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...

  10. 2019HDU多校补题

    心得:做不出,补不动 HUD第一场: 1001 Blank Y 1002 Operation Y 1003 Milk 1004 Vication Y 1005 Path Y 1006 Typewrit ...

最新文章

  1. YOLOv5在建筑工地中安全帽佩戴检测的应用
  2. html div中怎么引入另一个html文件
  3. 再查ReactOS项目
  4. 深度优先遍历算法-01小偷偷东西问题
  5. python中变量怎么定义_python中的变量的使用定义以及使用规则
  6. 第二十:如何把Jenkins+Allure2生成的报告发送邮件(重点超详细)
  7. uni-app 跳转支付宝小程序以及带参
  8. 微软enchange服务器安装,Exchange 2010 图文安装详解
  9. 循环结构——分数化简
  10. 5G 产业链:基站天线和小基站爆发潜力大
  11. 自动化测试方案设计和实现
  12. Host Windows 配置
  13. VMWare虚拟机Ubantu20.10添加中文智能拼音输入法
  14. QQ会员注册完整代码
  15. excel下拉列表联动_国家和城市的Excel下拉列表
  16. 打通零售新渠道,实现线上线下业务一体化
  17. 手机+卫星,到底有多难?
  18. sqlserver wait millis 60003, active 0, maxActive 20, creating 0(String)
  19. 苹果和华为鸿蒙,苹果的homeOSx和华为鸿蒙,两豪杰狭路相逢
  20. 那些C++程序让你笑三天的奇葩名字

热门文章

  1. 耗时10个小时用纯HTML和CSS写成的小兔鲜儿
  2. 2022年免费企业邮箱大全,用免费邮箱发邮件安全吗?
  3. java8新特性之一:流式数据处理(包含list,map数据处理)。
  4. 支付宝小程序访问浙里办应用,提示页面访问受限,IOS无法访问
  5. 读书笔记:《Scrum 敏捷软件开发》
  6. 2004年11月网络工程师级试题
  7. [译]-100行代码从零实现 Facebook 的 Recoil 库
  8. 转载--三少三多技术开发
  9. python:输出10行的杨辉三角 - 二项式的n次方展开系数
  10. 超级计算机运算中心,中国科学技术大学超级计算中心