二分专题

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;
}

 

posted @ 2020-12-27 10:11  new-code  阅读(79)  评论(0)    收藏  举报