作业介绍

二分答案

在单调符合答案的范围中找到极值

最小值最大化模板

//如果要求的内容在某个值以下的范围,要求这个范围的最大值
while(l<=r){
    int mid=l+r>>1;
    if(f(mid)) r = mid-1;
    else l = mid+1;
}
cout << r;

最大值最小化模板

//如果要求的内容在某个值以上的范围,要求这个范围的最小值
while(l<=r){
    int mid=l+r>>1;
    if(f(mid)) l = mid+1;
    else r = mid-1;
}
cout << l;

文件读写

freopen("D.in", "r", stdin);
freopen("D.out", "w", stdout);

第1题

#include <bits/stdc++.h>
using namespace std;

const int N=2e5+5;
int n, m;
int a[N];
int main() {
    freopen("D.in", "r", stdin);
    freopen("D.out", "w", stdout);
    cin >> n >> m;
    for(int i=1; i<=n; i++) cin >> a[i];
    sort(a+1, a+1+n);

    while(m--){
        int x;
        cin >> x;
        //通过二分法去找到n个数字当中与x差最小的数字,把差值加上
        int l=1, r=n;
        int flag = 0;
        while(l<=r){
            int mid = (l+r) / 2;
            if(a[mid] == x){
                cout << 0 << endl;
                flag = 1;
                break;
            }
            else if(a[mid] > x) r = mid-1;
            else l = mid+1;
        }
        if(flag==0){
            if(r<1) cout << a[1] - x << endl;
            else if(l>n) cout << x - a[n] << endl;
            else cout << min(x-a[r], a[l]-x) << endl;
        }
    }
    return 0;
}
状态
已结束
题目
11
开始时间
2024-3-9 0:00
截止时间
2024-3-16 23:59
可延期
24 小时