首页 > 其他分享 >6 二分 参考代码

6 二分 参考代码

时间:2023-08-06 09:00:16浏览次数:26  
标签:二分 参考 int 代码 long ++ MAXN scanf LL

P2249 [深基13.例1] 查找

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1000005;
int a[MAXN];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    while (m--) {
        int q; scanf("%d", &q);
        int idx = lower_bound(a + 1, a + n + 1, q) - a;
        printf("%d ", idx == n || a[idx] != q ? -1 : idx);
    }
    return 0;
}

P1102 A-B 数对

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 200005;
int a[MAXN];
int main()
{
    int n, c;
    scanf("%d%d", &n, &c);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    sort(a + 1, a + n + 1);
    LL ans = 0;
    for (int i = 1; i <= n; i++) 
        ans += upper_bound(a + 1, a + n + 1, a[i] + c) - lower_bound(a + 1, a + n + 1, a[i] + c);
    printf("%lld\n", ans);
    return 0;
}

P1678 烦恼的高考志愿

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 100005;
const int INF = 1e9;
int a[MAXN];
int main()
{
    int m, n;
    scanf("%d%d", &m, &n);
    for (int i = 0; i < m; ++i) scanf("%d", &a[i]);
    sort(a, a + m);
    LL ans = 0;
    while (n--) {
        int x;
        scanf("%d", &x);
        int idx = lower_bound(a, a + m, x) - a;
        int cur = INF;
        if (idx < m) cur = min(cur, abs(a[idx] - x));
        if (idx > 0) --idx;
        cur = min(cur, abs(a[idx] - x));
        ans += cur;
    }
    printf("%lld\n", ans);
    return 0;
}

P1824 进击的奶牛

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1e5 + 5;
int x[MAXN], n, c;
bool check(int mid) {
    int res = 1, pre = x[0];
    for (int i = 1; i < n; i++) {
        if (x[i] - pre >= mid) {
            res++;
            pre = x[i];
        }
    }
    return res >= c;
}
int main()
{
    scanf("%d%d", &n, &c);
    for (int i = 0; i < n; i++) scanf("%d", &x[i]);
    sort(x, x + n);
    int l = 0, r = x[n - 1] - x[0], ans;
    while (l <= r) {
        int mid = l + (r - l) / 2;
        if (check(mid)) {
            ans = mid; l = mid + 1;
        } else r = mid - 1;
    }
    printf("%d\n", ans);
    return 0;
}

P1873 [COCI2011-2012#5] EKO / 砍树

#include <cstdio>
using namespace std;
typedef long long LL;
const int MAXN = 1000005;
int n, m;
int h[MAXN];
bool check(int x) {
    LL sum = 0;
    for (int i = 0; i < n; ++i) {
        if (h[i] > x) sum += h[i] - x;
        if (sum >= m) return true;
    }
    return false;
}
int main()
{
    scanf("%d%d", &n, &m);
    int l = 0, r = 0, ans;
    for (int i = 0; i < n; ++i) {
        scanf("%d", &h[i]);
        if (h[i] > r) r = h[i];
    }
    while (l <= r) {
        int mid = (l + r) / 2;
        if (check(mid)) {
            l = mid + 1; ans = mid;
        } else r = mid - 1;
    }
    printf("%d\n", ans);
    return 0;
}

P2440 木材加工

#include <cstdio>
typedef long long LL;
const int MAXN = 100005;
int n, k, l[MAXN];
bool check(int x) {
    LL sum = 0;
    for (int i = 0; i < n; ++i) {
        sum += l[i] / x;
        if (sum >= k) return true;
    }
    return false;
}
int main()
{
    scanf("%d%d", &n, &k);
    LL sum = 0;
    int L = 1, R = 0, ans;
    for (int i = 0; i < n; ++i) {
        scanf("%d", &l[i]);
        sum += l[i];
        if (l[i] > R) R = l[i];
    }
    if (sum < k) {
        printf("0\n");
        return 0;
    }
    while (L <= R) {
        int mid = (L + R) / 2;
        if (check(mid)) {
            L = mid + 1; ans = mid;
        } else R = mid - 1;
    }
    printf("%d\n", ans);
    return 0;
}

P2678 [NOIP2015 提高组] 跳石头

#include <cstdio>
typedef long long LL;
const int MAXN = 50005;
int l, n, m, d[MAXN];
bool check(int x) {
    int cnt = 0, pre = 0;
    for (int i = 0; i < n; ++i) {
        if (d[i] - pre < x) ++cnt;
        else pre = d[i];
    }
    if (l - pre < x && pre != 0) ++cnt;
    return cnt <= m;
}
int main()
{
    scanf("%d%d%d", &l, &n, &m);
    for (int i = 0; i < n; ++i) scanf("%d", &d[i]);
    if (m == n) {
        printf("%d\n", l);
        return 0;
    }
    int L = 1, R = l, ans;
    while (L <= R) {
        int mid = (L + R) / 2;
        if (check(mid)) {
            L = mid + 1; ans = mid;
        } else R = mid - 1;
    }
    printf("%d\n", ans);
    return 0;
}

P1182 数列分段 Section II

#include <cstdio>
using namespace std;
typedef long long LL;
const int MAXN = 100005;
int n, m, a[MAXN];
bool check(LL x) {
    LL sum = 0;
    int g = 1;
    for (int i = 0; i < n; ++i) {
        if (sum + a[i] <= x) {
            sum += a[i];
        } else {
            ++g;
            sum = a[i];
        }
    }
    return g > m;
}
int main()
{
    scanf("%d%d", &n, &m);
    LL L = 0, R = 0, ans;
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
        if (a[i] > L) L = a[i];
        R += a[i]; 
    }
    while (L <= R) {
        LL mid = (L + R) / 2;
        if (check(mid)) L = mid + 1;
        else {
            R = mid - 1; ans = mid;
        }
    }
    printf("%lld\n", ans);
    return 0;   
}

P3743 kotori的设备

#include <cstdio>
typedef long long LL;
const int MAXN = 100005;
const double EPS = 1e-6;
int n, p, a[MAXN], b[MAXN];
bool check(double x) {
    double r = p;
    for (int i = 0; i < n; ++i) {
        double t = 1.0 * b[i] / a[i];
        if (t < x) r -= 1.0 * a[i] - b[i] / x;
    }
    return r > -EPS;
}
int main() {
    scanf("%d%d", &n, &p);
    LL cost = 0;
    for (int i = 0; i < n; ++i) {
        scanf("%d%d", &a[i], &b[i]);
        cost += b[i];
    }
    if (cost <= p) {
        printf("-1\n");
        return 0;
    }
    double L = 0, R = 1e11;
    while (R - L > EPS) {
        double mid = (L + R) / 2;
        if (check(mid)) L = mid;
        else R = mid;
    }
    printf("%.6f\n", L);
    return 0;
}

标签:二分,参考,int,代码,long,++,MAXN,scanf,LL
From: https://www.cnblogs.com/ronchen/p/17609062.html

相关文章

  • R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型|附代码数据
    原文链接:http://tecdat.cn/?p=9390原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于贝叶斯向量自回归(BVAR)的研究报告,包括一些图形和统计输出。介绍向量自回归(VAR)模型的一般缺点是,估计系数的数量与滞后的数量成比例地增加。因此,随着滞后次数的增加,每个参数可用的信息......
  • OpenApi(Swagger)快速转换成 TypeScript 代码 - STC
    在现代的Web开发中,使用OpenAPI(以前称为Swagger)规范来描述和定义API已经成为一种常见的做法。OpenAPI规范提供了一种统一的方式来描述API的结构、请求和响应,使得开发人员能够更好地理解和使用API。然而,手动编写与OpenAPI规范匹配的客户端代码或服务端框架可能是一项繁......
  • 学渣学习多旋翼无人机系列1——参考资料
    前言博主是十几年前自动化本科毕业,在工控相关行业摸爬滚打多年,如今从事嵌入式软件开发。作为一个中年还未秃头的男人,现在突然开始立志要学习无人机了???近期因为偶然的工作安排,需要详细了解一些无人机知识。当上了一些课程后,博主突然发现,这不是我们自动化专业理论嘛。博主大学没好......
  • 深入理解线程与进程:概念、特点与区别,附带代码演示
    当今计算机系统中,线程(Thread)和进程(Process)是并发编程中的关键概念。它们对于提高程序的效率和性能至关重要。本篇博客将详细介绍线程和进程的概念、特点以及它们之间的区别,同时通过代码演示来加深理解。1.线程1.1概念线程是操作系统能够进行运算调度的最小单位。一个进程可以包含......
  • 【LuoGU 1462】通往奥格瑞玛的道路——最短路+二分
    通往奥格瑞玛的道路题目背景在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量。有一天他醒来后发现自己居然到了联盟的主城暴风城。在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛。题目描述在艾泽拉斯,有\(n\)个城市。编号为\(1,2,3,\ldots,n\)。......
  • 最小生成树/二分图
    最小生成树Prim算法朴素版PrimO(n^2)稠密图步骤:S:表示最小生成树的集合初始化距离找距离集合S最近的节点将节点加入集合S用该节点更新非S点到集合S点的距离代码:constintN=510;constintINF=0x3f3f3f3f;intg[N][N];intd[N];//非生成树节点与生成树......
  • 代码随想录-字符串-c++总结
    关于字符串string一些库函数的使用,不太熟悉,导致开始做的时候比较磕磕绊绊主要用到了<algorithm>中的reverse,以及string的resize,substr,erase等,在这贴一个C++字符串(string)常用操作总结-知乎(zhihu.com)C++的string库用法总结-知乎(zhihu.com)反转字符串||中,每2k个字符进......
  • 前端多人协作之代码规范
    代码规范学习自并感谢Geekers-Admin和Hooks-Admin开源项目的作者HalseySpicy一、EditorConfigEditorConfig用于定义项目中的编辑器配置。可以确保团队成员在不同的编辑器中保持一致的代码风格和格式。......
  • 如何统计项目代码行数
    find."("-name"*"")"-print|xargswc-l1、打开终端,用cd命令定位到工程所在的目录。2、调用以下命令即可把每个源代码文件行数及总数统计出来(1)包括空行(会列出每个文件的代码行数):find."("-name"*.m"-or-name"*.mm"-or-name"*.c"-or......
  • 输入字符串查找字符串中都有什么组成 java代码如下
    importjava.util.Scanner;publicclassDemo02{publicstaticvoidmain(String[]args){System.out.println("请输入一个字符串:");Stringcc=newScanner(System.in).nextLine();char[]arr=cc.toCharArray();intcoun......