此题现有题解较为冗长,因此前来贡献一发最短解。

首先正常的思路是直接按题意模拟。即:

  • 枚举当前时刻 \(T\)
  • 对于每个人,标记该时刻想要拿到的书
  • 根据题目的要求判断冲突情况
  • 对书进行分配

实现起来复杂的地方主要在处理冲突上,考虑从这方面简化代码。

我们知道,时刻为 \(t\) 时第 \(i\) 个人已经等待的时间与他即将读哪本书无关,只与这个人开始等待的时刻有关。

故设 \(last_i\) 为第 \(i\) 个人开始等待(即读完上一本书)的时刻。则把人按照 \(last\) 的值为第一关键字,到达时间的值为第二关键字进行升序排列,不难证明对于同一本书,等待时间更长的人一定先被计算到。

既然已经说到这步,我们直接按把人排序后的先后顺序分配书就可以避免冲突问题了。

可能比其他做法多了个排序的 log,但对于此题数据范围依然绰绰有余。

AC code:

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int T,n;
struct node{
int arr,k,ls;
int s[10],t[10],flg[10];
}a[N];
bool cmp(node x,node y){
if(x.ls==y.ls) return x.arr<y.arr;
else return x.ls<y.ls;
}
int ans,bk[N];
int main()
{
scanf("%d%d",&T,&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].arr,&a[i].k);a[i].arr++;
for(int j=1;j<=a[i].k;j++) scanf("%d%d",&a[i].s[j],&a[i].t[j]);
a[i].ls=a[i].arr;
}
for(int t=1;t<=T;t++)
{
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(a[i].ls>t||a[i].arr>t) continue;
for(int k=1;k<=a[i].k;k++)
{
if((bk[a[i].s[k]]<=t)&&(!a[i].flg[k]))
{
ans++;a[i].flg[k]=1;
a[i].ls=bk[a[i].s[k]]=t+a[i].t[k];
break;
}
}
}
}
cout<<ans<<endl;
return 0;
}

P1844 阅览室的更多相关文章

  1. 天梯赛 L1-043 阅览室

    L1-043 阅览室 (20 分) 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为 ...

  2. L1-043 阅览室

    天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过1000的正整数.当管理员将0 ...

  3. PAT-GPLT训练集 L1-043 阅览室

    PAT-GPLT训练集 L1-043 阅览室 注意:连续的S和E才算一次借还 代码: #include<iostream> #include<cstdio> using nam ...

  4. L1-043 阅览室 (20 分)

    天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过1000的正整数.当管理员将0 ...

  5. PAT 天梯赛 L1-043 阅览室

    L1-043. 阅览室 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者 ...

  6. 团体程序设计天梯赛-练习集-*L1-043. 阅览室

    L1-043. 阅览室 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过100 ...

  7. PAT L1-043. 阅览室

    L1-043. 阅览室 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者 ...

  8. 2017CCCC决赛 L1-3. 阅览室

    L1-3 阅览室(20 分) 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过 ...

  9. PAT 天梯赛 L1-043. 阅览室 【STL】

    题目链接 https://www.patest.cn/contests/gplt/L1-043 思路 将每一次 借出和归还 都用 MAP 标记 如果归还的时候 已经被标记过了 那么 ANS ++ 并且 ...

  10. RHEL7 CentOS7 检查查看精简指令

    RHEL7 CentOS7 检查查看精简指令: //////////////////////////检查查看精简指令://///////////////////////////// ///////// ...

随机推荐

  1. Linux相关概念及操作

    目录 linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",然后在此目录下再创建其他的目录. 1./bin 是Binary的缩写,这个目录存放着最经常使 ...

  2. ENVI大气校正方法反演Landsat 7地表温度

    本文介绍基于ENVI软件,实现对Landsat 7遥感影像加以大气校正方法的地表温度反演操作. 目录 1 图像前期处理与本文理论部分 2 实际操作 2.1 植被覆盖度计算 2.2 地表比辐射率计算 2 ...

  3. fread()模板

    char buf[1<<20],*p1,*p2;#define GC (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin ...

  4. vs(visual stuiod)中vc++工程的Filter和Folder及vcxproj知识

    vs中创建Filter 在一个新项目中右键 - Add - New,默认只有一选项 New Filter. 创建出来的Filter可以理解为是VS的过滤器(虚拟目录),它不会在本地的磁盘上新建目录,而 ...

  5. NOIP2022 题解

    终于有机会补NOIP的题了 T1 考虑枚举 C 与 F 的纵列 考虑预处理出每个点最左边和最下边可以延伸到哪 之后枚举列,然后对行做类似于扫描线的操作,统计有多少可行的 "第一横行" ...

  6. Cesium 概述 (二) 空间数据可视化

    https://blog.csdn.net/happyduoduo1/article/details/51865811/

  7. ES6之清楚明白的使用类(class)

    定义 类是构造函数.原型链的语法糖. 定义类有两种方式 class Student { } var Student = class { } 某些浏览器可能无法解析es6及以上的语法,这时候需要通过ba ...

  8. [nginx]日志中记录自定义请求头

    前言 假设在请求中自定义了一个请求头,key为"version",参数值为"1.2.3",需要在日志中捕获这个请求头. nginx日志配置 只需要用变量http ...

  9. 使用 Vue 实现页面访问拦截

    目录 1 Vue 路由与导航守卫 1.1 Vue 路由简介 1.2 导航守卫概述 2 实现访问拦截的核心概念 2.1 路由守卫介绍 2.1.1 前置守卫(beforeEach) 2.1.2 后置钩子( ...

  10. 头疼!卷积神经网络是什么?CNN结构、训练与优化一文全解

    本文全面探讨了卷积神经网络CNN,深入分析了背景和重要性.定义与层次介绍.训练与优化,详细分析了其卷积层.激活函数.池化层.归一化层,最后列出其训练与优化的多项关键技术:训练集准备与增强.损失函数.优 ...