当前位置: 首页 > news >正文

代码训练1

P1083 [NOIP 2012 提高组] 借教室 

使用差分和二分查找优化算法

#include <stdio.h>
#include <string.h>

#define N 1000010

typedef long long LL;

int n, m;
int w[N];  // 每天的教室数量
int l[N], r[N], d[N];  // 订单的起始时间、结束时间和需要的教室数量
LL b[N];  // 差分数组,用于计算每天的需求

// 检查前 mid 个订单是否能满足
int check(int mid) {
    memset(b, 0, sizeof(b));  // 初始化差分数组
    for (int i = 1; i <= mid; i++) {
        b[l[i]] += d[i];  // 订单i的需求
        b[r[i] + 1] -= d[i];  // 结束时间后的需求减少
    }

    // 计算每日的教室需求并判断是否超过最大容量
    for (int i = 1; i <= n; i++) {
        b[i] += b[i - 1];  // 累加前一天的需求
        if (b[i] > w[i]) return 0;  // 如果需求超过最大容量,返回false
    }

    return 1;  // 如果前 mid 个订单都能满足,返回true
}

int main() {
    // 输入天数 n 和订单数量 m
    scanf("%d %d", &n, &m);

    // 输入每天的教室数量 
    for (int i = 1; i <= n; i++) {
        scanf("%d", &w[i]);
    }

    // 输入每个订单的起始时间、结束时间和需要的教室数量
    for (int i = 1; i <= m; i++) {
        scanf("%d %d %d", &d[i], &l[i], &r[i]);
    }

    // 使用二分查找找最早无法满足的订单
    int l = 0, r = m;
    while (l < r) {
        int mid = (l + r + 1) / 2;  // 取中间值
        if (check(mid)) {
            l = mid;  // 如果前 mid 个订单能满足,继续向右查找
        } else {
            r = mid - 1;  // 否则向左查找
        }
    }

    // 输出结果
    if (r == m) {
        printf("0\n");  // 如果所有订单都能满足,输出0
    } else {
        printf("-1\n%d\n", r + 1);  // 否则输出最早无法满足的订单编号
    }

    return 0;
}

相关文章:

  • c语言学习12天
  • 新潮透明液体水珠水滴失真故障扭曲折射特效海报字体标题设计ps样机动作素材 Bubble Photoshop Templates
  • Go基础一(Maps Functions 可变参数 闭包 递归 Range 指针 字符串和符文 结构体)
  • Telegram机器人开发
  • Arduino示例代码讲解:LED bar graph LED线条图
  • 基于vue框架的重庆美食网站的设计与实现kt945(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 链表和数组的效率
  • 无人驾驶是自动化还是智能化?
  • 玩转MCP:用百度热搜采集案例快速上手并接入cline
  • 2024华为OD机试真题-任务最优调度(C++/Java/Python)-E卷-200分
  • 过滤震荡行行策略思路
  • 『不废话』之Llama 4实测小报
  • Mistral 7B 模型结构讲解与训练过程分析:小尺寸,好效果
  • 使用 MyBatis-Plus 实现高效的 Spring Boot 数据访问层
  • RESTFul是什么
  • 双系统ubuntu20.04不能外接显示器的解决办法
  • 【计网】TCP 协议详解 与 常见面试题
  • 【langchain4j系列教程-02】Langchain4j调用DeepSeek
  • 2025年3月30日(sigmoid-hil)
  • #Linux内存管理# 在系统启动时,ARM Linux内核如何知道系统中有多大的内存空间?
  • 做网站是要编程吗/免费网站推广平台
  • wordpress 轮播广告/seo外链自动群发工具
  • 织梦 视频网站源码/免费发布信息平台有哪些
  • 做国厂家的网站/seo中国
  • 潍坊大型网站建设/站长工具百度百科
  • 做网站赚广告/关键词组合工具