二分专题
https://blog.csdn.net/slience_646898/article/details/81086695
洛谷 P1024
https://www.luogu.com.cn/problem/P1024
程序模板
#include<bits/stdc++.h> using namespace std; //定义变量 //计算函数值 double f(double x){ } //二分start 为x1 end 为x2 void binarySearch(double x1,double x2){ //如果精度小于0.001 则返回x1 //如果f(mid)==0 返回 mid //如果f(x1)==0 返回 x1 当然x2也行,只能用其中一个 // 如果f(x1)*f(mid)<0 递归 x1,mid // 如果f(mid)*f(x2)<0 递归 mid,x2 } int main(){ //-100 100循环 二分查找 每次增加1 --两根之差绝对值大于>=1 }
洛谷 P2249
https://www.luogu.com.cn/problem/P2249
程序模板
#include<bits/stdc++.h> using namespace std; //数据定义、数组-存放给出的数等 //二分查找 1 查找数组 a 开始start 结束 end 要查找数 k int binarySearch(int a[], int start, int end, int k){ //二分查找 start<end 条件 缩小范围继续查找 while(start < end) { //取整数start end中间数 mid // 如果 >=k end =mid 否则 start =mid+1 为什么? } //二分结束 a[start] 是否 等于 k 是 则return start 否则return -1 } int main(){ //输入 n m cin >> n >> m; // n个数输入到数组 // 循环输入 m个要查找的数 给一个临时变量 k // 每次循环调用binarySearch 函数 a 1 n k 入参 return 0; } 11 3 1 3 3 3 5 7 9 11 13 15 15 1 3 6 --1 2 -1 11 1 1 2 2 2 2 3 9 11 13 15 15 3 -- 6
洛谷 P1163
https://www.luogu.com.cn/problem/P1163
程序模板
#include<bits/stdc++.h> using namespace std; //loan贷款金额 pay 每月分期付款金额 分期付款还清需要总月数 double loan, pay, month; //判断某个利率是否month月是否可以还完 true 没还完 false 已还完 bool check(double lv){ // 定义临时变量 暂存 loan贷款金额 double m = loan; //循环 所有月 每次循环 m*(1+lv) -pay 为什么? // 如果通过m的值 要函数要求返回true or false } int main(){ //输入贷款金额 每月还款金额 还款月份 double low = 0, high = 5;//最大值月利率500%,按常识几乎不可能 //二分缩小可能利率范围数字 while(high - low >= 0.0001) {//需要精确到0.1%,即:0.001,计算多一位 //计算 high和low的中间数 //调用check 参数mid 函数判断,如果没还完,降低利率 否则 提升利率 } } //二分结束 找到适合的利率 输出 注意百分数后保留1位小数 return 0; }
P1102
https://www.luogu.com.cn/problem/P1102
程序模板
#include<bits/stdc++.h> using namespace std; long long a[2000005], n, c, ans; int main(){ //输入 n c // 循环输入n个数 //二分查找首先需要排序 为a数组排序 可用sort for (int i = 1; i <= n; i++){ int tempA,firstA,nextA; //tempA=当前数 + c A-B=C --> A=B+C //upper_bound二分查找 第一个>tempA的位置 //lower_bound二分查找 第一个tempA的位置 //ans+=(nextA - firstA) } cout << ans; return 0; }
P1678
https://www.luogu.com.cn/problem/P1678
程序模板
#include<bits/stdc++.h> using namespace std; int m,n,a[1000010],b[1000010]; int main(){ //输入高校数和学生数 //输入m个高校分数到数组a //为数组a排序 //输入n个学生分数到数组b int ans=0; //每个学生和所有学校分数进行二分查找 for (int i=1;i<=n;i++){ int l=0,r=m+1;//二分查找左右初始边界 while (l<r){//二分查找,直到左右相遇 //取左右边界中间值 // int mid=(l+r)/2; //如果学校分数中间值a[mid]<=当前学生成绩b[i] //右半部分二分,否则左半部分二分 } //如果学生考的太差 //比学校分数最小的还小 b[i]<=a[1] 单独处理 a[1]-a[i] 为其差值 //否则 取 abs(a[l-1]-b[i]) 小的一个abs(a[l]-b[i]) } cout<<ans; return 0; }
查找最接近的元素
http://noi.openjudge.cn/ch0111/01/
#include<bits/stdc++.h> using namespace std; long long a[100001]; int n; void Solve(long long aim) { int left = 1; int right = n; int mid; while(left + 1 < right) { mid = left + (right - left) / 2; if(a[mid] < aim) { left = mid; } else { right = mid; } } if(abs(a[left]-aim)<=abs(a[left+1]-aim)) { cout<<a[left]<<endl; } else { cout<<a[left + 1]<<endl; } return; } int main() { scanf("%d",&n); for(int i = 1; i<=n; i++) { scanf("%d",&a[i]); } int m; cin>>m; for(int i = 1; i<=m; i++) { int tmp; cin>>tmp; if(n == 1) { cout<<a[1]<<endl; } else { Solve(tmp); } } return 0; }
P1678
https://www.luogu.com.cn/problem/P2759

#include <iostream> #include <cmath> using namespace std; typedef long long ll; int main() { ll n; ll l = 1; ll r = 1000000000; cin>>n; while(l <= r) { // cout<<l<<endl; ll mid = (l + r) >> 1; ll res = mid * log10(1.0 * mid) + 1; if(res < n) { l = mid + 1; } else r = mid - 1; } cout<<l<<endl; return 0; }
P1918 保龄球
https://www.luogu.com.cn/problem/P1918
#include <iostream> #include <algorithm> using namespace std; int n; struct node{ int num; int index; }a[100005]; bool cmp(node u, node v) { return u.num < v.num; } int binarysearch(int x) { int l = 0; int r = n-1; while(l <= r) { int mid = (l + r) >> 1; if(a[mid].num == x) { cout<<a[mid].index<<endl; return 0; } else if(a[mid].num > x) r = mid - 1; else l = mid + 1; } cout<<0<<endl; return 0; } int main() { int dl, q, res; cin>>n; for(int i=0; i<n; i++) { cin>>a[i].num; a[i].index = i+1; } sort(a, a+n, cmp); cin>>q; for(int i=0; i<q; i++) { cin>>dl; binarysearch(dl); } return 0; }
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号