Java实现 蓝桥杯VIP 算法训练 会议中心
算法训练 会议中心
时间限制:2.0s 内存限制:512.0MB
会议中心 Siruseri政府建造了一座新的会议中心。许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议。
对于一个客户而言,仅当在开会时能够独自占用整个会堂,他才会租借会堂。会议中心的销售主管认为:最好的策略应该是将会堂租借给尽可能多的客户。显然,有可能存在不止一种满足要求的策略。
例如下面的例子。总共有4个公司。他们对租借会堂发出了请求,并提出了他们所需占用会堂的起止日期(如下表所示)。
上例中,最多将会堂租借给两家公司。租借策略分别是租给公司1和公司3,或是公司2和公司3,也可以是公司1和公司4。注意会议中心一天最多租借给一个公司,所以公司1和公司2不能同时租借会议中心,因为他们在第九天重合了。
销售主管为了公平起见,决定按照如下的程序来确定选择何种租借策略:首先,将租借给客户数量最多的策略作为候选,将所有的公司按照他们发出请求的顺序编号。对于候选策略,将策略中的每家公司的编号按升序排列。最后,选出其中字典序最小[1]的候选策略作为最终的策略。
例中,会堂最终将被租借给公司1和公司3:3个候选策略是{(1,3),(2,3),(1,4)}。而在字典序中(1,3)<(1,4)<(2,3)。
你的任务是帮助销售主管确定应该将会堂租借给哪些公司。
输入格式
输入的第一行有一个整数N,表示发出租借会堂申请的公司的个数。第2到第N+1行每行有2个整数。第i+1行的整数表示第i家公司申请租借的起始和终止日期。对于每个公司的申请,起始日期为不小于1的整数,终止日期为不大于109的整数。
输出格式
输出的第一行应有一个整数M,表示最多可以租借给多少家公司。第二行应列出M个数,表示最终将会堂租借给哪些公司。
数据规模和约定
对于50%的输入,N≤3000。在所有输入中,N≤200000。
样例输入
4
4 9
9 11
13 19
10 17
样例输出
2
1 3
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 会议中心 {
static int[] sqqs,sqzz,sqsx,sqcf,cxz,finz;
static int[][] dgb;
static int n=0,fin=0,max=0;
public static void main(String[] args)throws IOException {
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
String s=reader.readLine();
n=Integer.parseInt(s);
sqqs=new int[n+1];
sqzz=new int[n+1];
sqcf=new int[n+1];
for(int i=1;i<=n;i++){
s=reader.readLine();
String[] sa = s.split(" ");
sqqs[i]=Integer.parseInt(sa[0]);
sqzz[i]=Integer.parseInt(sa[1]);
if (max<sqzz[i]) max=sqzz[i];
}
sqsx=new int[max+1];
for (int i=1;i<=n;i++){
if (sqsx[sqzz[i]]==0){
sqsx[sqzz[i]]=i;
}else{
if (sqqs[i]>sqqs[sqsx[sqzz[i]]]){
for (int j=1;j<=n;j++){
if (sqcf[j]==0){
sqcf[j]=sqsx[sqzz[i]];
sqsx[sqzz[i]]=i;
break;
}
}
}
}
}
dgb=new int[2][n+1];
for (int i=1;i<=max;i++) {
if (sqsx[i]!=0) {
getcs(sqsx[i]);
}
}
for (int i=1;i<=n;i++){
if (fin<dgb[0][i]) fin=dgb[0][i];
}
for (int k=max;k>=1;k--){
if (sqsx[k]==0) continue;
int i=sqsx[k];
if (dgb[0][i]==fin) continue;
for (int j=sqzz[i]+1;j<=max;j++){
if (j==max){
dgb[0][i]=0;
dgb[1][i]=0;
continue;
}
if (sqsx[j]==0) continue;
if (dgb[0][sqsx[j]]==0) continue;
if ((dgb[0][sqsx[j]]==dgb[0][i]+1)&(sqqs[sqsx[j]]>sqzz[i])) break;
if (dgb[0][sqsx[j]]>dgb[0][i]+1) {
dgb[0][i]=0;
dgb[1][i]=0;
break;
}
}
}
for (int i=1;i<=n;i++) {
if (sqcf[i]!=0) {
getcs1(sqcf[i]);
} else break;
}
cxz=new int[fin+1];
finz=new int[fin+1];
int xh=1;
for (int i=1;i<=n;i++){
if (dgb[0][i]==0) continue;
if (cxz[dgb[0][i]]!=0) continue;
if (fincheck(i)==1){
finz[xh]=i;
xh++;
cxz[dgb[0][i]]=i;
dealsq(i);
}
}
System.out.println(fin);
for (int i=1;i<=fin;i++){
System.out.print(""+finz[i]+" ");
}
System.out.println();
}
static void getcs(int a){
int cs=0;
for (int i=sqqs[a]-1;i>0;i--){
if (sqsx[i]!=0){
cs=dgb[0][sqsx[i]];
if (cs!=0) {
break;
}
}
}
for (int i=sqqs[a];i<sqzz[a];i++){
if (sqsx[i]!=0){
if (dgb[0][sqsx[i]]>cs+1) return;
}
}
dgb[0][a]=cs+1;
dgb[1][a]=1;
}
static void getcs1(int a){
int cs=0;
int b=dgb[0][sqsx[sqzz[a]]];
if (b==0) return;
for (int i=sqqs[a]-1;i>0;i--){
if (sqsx[i]!=0){
cs=dgb[0][sqsx[i]];
if (cs!=0) {
break;
}
}
}
if (cs+1<b) return;
dgb[0][a]=cs+1;
dgb[1][a]=1;
}
static int fincheck(int a){
int[] lsst=new int[fin+1];
int b=0,c=0,sc=0,ec=0;
int cs=dgb[0][a];
for (int i=cs-1;i>=1;i--){
if (cxz[i]!=0) {
b=cxz[i];
sc=i;
break;
}
}
if (b!=0){
lsst[sc]=sqzz[b];
for (int i=sqzz[b]+1;i<sqqs[a];i++){
if (sqsx[i]==0) continue;
if (dgb[0][sqsx[i]]==0) continue;
if (lsst[dgb[0][sqsx[i]]]!=0) continue;
if (sqqs[sqsx[i]]<=lsst[dgb[0][sqsx[i]]-1]) continue;
lsst[dgb[0][sqsx[i]]]=sqzz[sqsx[i]];
}
if (lsst[cs-1]==0) return 0;
if (lsst[cs-1]>=sqqs[a]) return 0;
}
for (int i=cs+1;i<=fin;i++){
if (cxz[i]!=0){
c=cxz[i];
ec=i;
break;
}
}
if (c!=0){
lsst[ec]=sqqs[c];
for (int i=sqqs[c]-1;i>sqzz[a];i--){
if (sqsx[i]==0) continue;
if (dgb[0][sqsx[i]]==0) continue;
if (i>=lsst[dgb[0][sqsx[i]]+1]) continue;
lsst[dgb[0][sqsx[i]]]=Math.max(sqqs[sqsx[i]],lsst[dgb[0][sqsx[i]]]);
}
if (lsst[cs+1]==0) return 0;
if (lsst[cs+1]<=sqzz[a]) return 0;
}
return 1;
}
static void dealsq(int a){
int cs=dgb[0][a];
for (int i=sqzz[a]-1;i>=1;i--){
if (sqsx[i]==0) continue;
if (dgb[0][sqsx[i]]==0) continue;
int dcs=dgb[0][sqsx[i]];
if (dcs==cs) {
dgb[0][sqsx[i]]=0;
dgb[1][sqsx[i]]=0;
continue;
}
if (dcs==cs-1) {
if (i>=sqqs[a]) {
dgb[0][sqsx[i]]=0;
dgb[1][sqsx[i]]=0;
continue;
}
}
if (dcs==cs-2) break;
}
for (int i=sqzz[a]+1;i<=max;i++){
if (sqsx[i]==0) continue;
if (dgb[0][sqsx[i]]==0) continue;
int dcs=dgb[0][sqsx[i]];
if (dcs==cs) {
dgb[0][sqsx[i]]=0;
dgb[1][sqsx[i]]=0;
continue;
}
if (dcs==cs+1) {
if (sqzz[a]>=sqqs[sqsx[i]]) {
dgb[0][sqsx[i]]=0;
dgb[1][sqsx[i]]=0;
continue;
}
}
if (dcs==cs+2) break;
}
}
}
Java实现 蓝桥杯VIP 算法训练 会议中心的更多相关文章
- Java实现蓝桥杯VIP 算法训练 找公倍数
问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题目要求的输入范例. 样例输出 与上面的样例输入对应的输出. 这道题其实没有什么可写的,但是为了让读者更方便的 ...
- Java实现 蓝桥杯VIP 算法训练 连通分块(并查集)
试题 算法训练 连通分块 资源限制 时间限制:200ms 内存限制:8.0MB 问题描述 连通分块 输入格式 输入的第一行包含两个整数n, m n代表图中的点的个数,m代表边的个数 接下来m行,每行2 ...
- Java实现 蓝桥杯VIP 算法训练 无权最长链
试题 算法训练 无权最长链 问题描述 给定一个n节点m边的无圈且连通的图,求直径 输入格式 第一行两个数字n,m 接下来m行每行两个数字x,y,代表x,y之间有一条边 输出格式 要求用户的输出满足的格 ...
- Java实现 蓝桥杯VIP 算法训练 星际交流
算法训练 星际交流 时间限制:1.0s 内存限制:256.0MB 问题描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...
- Java实现 蓝桥杯VIP 算法训练 Car的旅行路线
大家可以看一下这个,蓝桥杯官网的这道题是有问题的 Car的旅行路线 算法训练 Car的旅行路线 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 查看参考代码 问题描述 又到暑假 ...
- Java实现 蓝桥杯VIP 算法训练 最大质因数(暴力)
试题 算法训练 最大质因数 问题描述 给出N个数字,求出有最大的最大质因数的那个数 输入格式 第一行:一个整数N. 接下来的N行,每行一个整数A_i,表示给出的那N个数字. 输出格式 第一行:一个整数 ...
- Java实现 蓝桥杯VIP 算法训练 与1连通的点的个数(并查集)
试题 算法训练 与1连通的点的个数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 没有问题描述. 输入格式 输入的第一行包含两个整数n, m n代表图中的点的个数,m代表边的个数 ...
- Java实现 蓝桥杯VIP 算法训练 非递归(暴力)
试题 算法训练 非递归 问题描述 当x>1时,Hermite多项式的定义见第二版教材125页.用户输入x和n,试编写"非递归"函数,输出对应的Hermite多项式的值.其中x ...
- Java实现 蓝桥杯VIP 算法训练 步与血(递推 || DFS)
试题 算法训练 步与血 问题描述 有n*n的方格,其中有m个障碍,第i个障碍会消耗你p[i]点血.初始你有C点血,你需要从(1,1)到(n,n),并保证血量大于0,求最小步数. 输入格式 第一行3个整 ...
随机推荐
- Ubuntu 18.04 新系统 允许root远程登录
1. 查看ssh服务器是否安装并启动 #sudo ps -e | grep ssh 1. 安装ssh服务器 #sudo apt-get install openssh-server 2. 配置sshd ...
- python路径操作新标准:pathlib 模块
之前如果要使用 python 操作文件路径,我总是会条件反射导入 os.path. 而现在,我会更加喜欢用新式的 pathlib, 虽然用得还是没有 os.path 熟练,但是以后会坚持使用. pat ...
- Autohotkey心得
玩游戏,烧钱和作弊是永恒的话题,热键一定程度上和作弊相关.办公用数据库.编程.商业智能,一定程度上也是作弊,欺负没有相关信息技术的公司.个人. 避免和输入法产生冲突,少用Send,多用剪切板中转. E ...
- CF#214 C. Dima and Salad 01背包变形
C. Dima and Salad 题意 有n种水果,第i个水果有一个美味度ai和能量值bi,现在要选择部分水果做沙拉,假如此时选择了m个水果,要保证\(\frac{\sum_{i=1}^ma_i}{ ...
- 【HDU4990】递推式
题目大意:给定序列 1, 2, 5, 10, 21, 42, 85, 170, 341 …… 求第n项 模 m的结果 递推式 f[i] = f[i - 2] + 2 ^ (i - 1); 方法一: ...
- Mysql 常用函数(8)- concat 函数
Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html concat 的作用 连接多个字符串 concat ...
- Docker学习笔记(二):端口映射与容器互联
端口映射 使用docker run时,可以指定-P(大写)与-p(小写)参数映射端口. docker run -P -P(大写)会随机映射一个端口到容器的内部端口 -> [feifei@ffma ...
- 我找到了Dubbo源码的BUG,同事纷纷说我有点东西
点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的 ...
- Django模板之自定义过滤器/标签/组件
自定义步骤: 1. 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2. 在app应用中创建templatet ...
- form组件注册ajax登录auth认证及验证码
本项目采用django自带的数据库 项目文件 models.py from django.db import models from django.contrib.auth.models import ...