Problem L - School Reunion —— 思维

2024-04-07 00:58
文章标签 思维 problem school reunion

本文主要是介绍Problem L - School Reunion —— 思维,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

So, the alumni association of your school is arranging it’s annual reunion tomorrow. N+1
people will attend the ceremony, which includes Mr. Kashem, a notable alumnus of the
school. But he can’t stay for a long period of time, because you know, he has other
important things to do. However, Mr. Kashem wants to meet at least P​ persons. His
assistant has acquired information about tomorrow’s plan of the N​ other persons - the
time they will arrive, and the time they will exit. Now he needs to figure out the minimum
amount of time Mr. Kashem has to stay on the reunion to meet at least P​ persons. It is
obviously complicated to solve this problem by hand, and Mr. Kashem’s assistant has zero
knowledge on programming. Can you help him solving this problem?
Input Specification
First line of input contains an integer T​, indicating the number of test cases. Each test case
starts with a line containing two integers N​ and P​. Here N​ indicates the number of people
other than Mr. Kashem, who will attend the reunion. And P​ indicates the minimum number
of people Mr. Kashem wants to meet. Following N​ lines contain two integers each, st​
i​ and
en​
i​
, denoting the entry and exit time of the i​
th​ person.
Constraints
1 ≤ T ≤ 30
1 ≤ P ≤ N ≤ 100000
1 ≤ sti ≤ eni ≤ 1000000000
Use fast input method. For example, prefer using scanf to cin in C/C++.
Output Specification
For each test case, print the case number starting from 1, followed by the answer to the
case in a separate line. See sample I/O for better understanding.
Statements
Online Selection Contest, BACS Regional Programming Camp, 2018
BACS High School Programming Contest, 2018
Input Output
2
5 3
1 3
8 12
6 9
14 17
2 7
3 3
1 6
4 7
6 9
Case 1: 1
Case 2: 0

题意:

给你n个线段,让你求出最短的长度使得这个长度能穿过至少p个线段

题解:

很容易就得出一个结论:这个长度必定是在某个线段的结尾之后或者开头之前包括这个结尾或者开头。
那么我们只要遍历每一个结尾和开头就能找出答案,我们只要把结尾和开头放到两个数组里,在找结尾的时候只需要找到第一个大于他的开头,再往下找就好了,但是注意有些线段是穿过这个结尾的,那么我们就要把那些线段数量给加上去,就是lower_bound结尾,upper_bound开头,再减一减就ok了,找开头只需要把所有数对2e9反一下就好了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pill pair<int,int>
const int N=1e5+9;pill ed[N];
int st[N],en[N];int main()
{int t;cin>>t;int ca=0;while(t--){int p,n;scanf("%d%d",&n,&p);for(int i=1;i<=n;i++){scanf("%d%d",&ed[i].first,&ed[i].second);st[i]=ed[i].first;en[i]=ed[i].second;}if(p==1){printf("Case %d: 0\n",++ca);continue;}sort(st+1,st+1+n);sort(en+1,en+1+n);int ans=2e9;for(int i=1;i<=n;i++){int pos=lower_bound(st+1,st+1+n,ed[i].second)-st;int need=p-1+(ed[i].first==ed[i].second?1:0);need-=((n-(lower_bound(en+1,en+1+n,ed[i].second)-en)+1)-(n-(upper_bound(st+1,st+1+n,ed[i].second)-st)+1));if(ed[i].first!=ed[i].second)need++;if(need<=0){ans=0;break;}int idx=pos+need-1;if(idx>n)continue;ans=min(ans,st[idx]-ed[i].second);}for(int i=1;i<=n;i++)ed[i].first=2e9-ed[i].first,ed[i].second=2e9-ed[i].second,st[i]=2e9-st[i],en[i]=2e9-en[i];sort(st+1,st+1+n);sort(en+1,en+1+n);for(int i=1;i<=n;i++){int pos=lower_bound(st+1,st+1+n,ed[i].second)-st;int need=p-1+(ed[i].first==ed[i].second?1:0);need-=((n-(lower_bound(en+1,en+1+n,ed[i].second)-en)+1)-(n-(upper_bound(st+1,st+1+n,ed[i].second)-st)+1));if(ed[i].first!=ed[i].second)need++;if(need<=0){ans=0;break;}int idx=pos+need-1;if(idx>n)continue;ans=min(ans,st[idx]-ed[i].second);}printf("Case %d: %d\n",++ca,ans);}return 0;
}

这篇关于Problem L - School Reunion —— 思维的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881269

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

颠覆你的开发模式:敏捷思维带来的无限可能

敏捷软件开发作为现代软件工程的重要方法论,强调快速响应变化和持续交付价值。通过灵活的开发模式和高效的团队协作,敏捷方法在应对动态变化和不确定性方面表现出色。本文将结合学习和分析,探讨系统变化对敏捷开发的影响、业务与技术的对齐以及敏捷方法如何在产品开发过程中处理持续变化和迭代。 系统变化对敏捷软件开发的影响 在敏捷软件开发中,系统变化的管理至关重要。系统变化可以是需求的改变、技术的升级、

0906作业+思维导图梳理

一、作业: 1、创捷一个类似于qq登录的界面 1)源代码 #include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);//QPushbutton:登录、退出this->join = new QP

11991 - Easy Problem from Rujia Liu?

题意: 输入一串整型数列,再输入两个数k,v,输出第k个v的序号。不存在则输出0,如第一个样例 8 41 3 2 2 4 3 2 11 3 //第1个3,序号为2,输出22 4 //第2个4,不存在,输出03 2 //第3个2,序号为7,输出74 2 思路: struct num {

[机缘参悟-222] - 系统的重构源于被动的痛苦、源于主动的精进、源于进化与演进(软件系统、思维方式、亲密关系、企业系统、商业价值链、中国社会、全球)

目录 前言:系统的重构源于被动的痛苦、源于主动的精进、源于进化与演进 一、软件系统的重构 1、重构的定义与目的 2、重构的时机与方法 3、重构的注意事项 4、重构的案例分析 二、大脑思维的重构 1、大脑思维重构的定义 2、大脑思维重构的方法 3、大脑思维重构的挑战与前景 三、认知的重构 1、定义 2、目的 3、方法 四、实例 五、总结 四、婚姻家庭的重构 1、婚

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

散户炒股票为什么进步慢,学习程序化交易思维

炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取股票实时数据和历史数据 Python炒股自动化(3):分析取回的实时数据和历史数据 Python炒股自动化(4):通过接口向交易所发送订单 Python炒股自动化(5):通过接口查询订单,查询账户资产 散户炒股的常见难题

HDU 1016 Prime Ring Problem (深搜)

OJ题目 : click here ~~ 大概题意:n个数,形成一个环,使得相邻两个数的和为素数。以1开始,按字典序输出序列。 很简单的深搜。 AC_CODE int n;int visit[22];int num[22];int len;bool Is_prime(int x){for(int i = 2;i*i <= x;i++)if(x%i == 0) return

数业智能心大陆告诉你如何培养孩子的批判性思维?

现今的教育体系自小学起便强调培养孩子的批判性思维,这种能力被视为在复杂世界中生存和发展的关键。在当今信息爆炸的时代,它能让我们在海量信息中辨别真伪、深入思考并做出明智决策。如今,如数业智能心大陆产出的AI 心理咨询平台的出现为培养孩子批判性思维提供了新可能,其通过互动引导孩子思考,助力孩子提升批判性思维能力。 什么是批判性思维呢? 批判性思维是一种思考方式,它能够使我们在接收信