NOIP模拟 Problem 1 任务安排 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目大意:

你有N个任务,每个任务有其持续时间和截止日期,你在同一时间只能进行一项任务。

问:要完成所有的任务,你最晚要从什么时候开始工作?(最早可从0开始)

输入格式:

第一行一个整数N,表示任务数。

接下来N行,每行两个数Ti、Si,分别表示该任务的持续时间和截止日期。

输出格式:

输出一个整数,表示最晚开始工作的时间。如果无法按时完成任务,输出-1.

样例输入:

4

3 5

8 14

5 20

1 16

样例输出:

2

数据范围:

N<=100000,Ti<=100000,Si<=1000000.

分析:

把ans的初始值设为-1,二分最晚开始工作的时间即可。

也可以增加一步特判,如果总用时>最晚完成的任务的截止日期,直接输出-1.

AC代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<queue>
 7
 8 const int MAXN = 100005;
 9
10 inline void read(int &x)
11 {
12     char ch = getchar(),c = ch;x = 0;
13     while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar();
14     while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar();
15     if(c == ‘-‘) x = -x;
16 }
17
18 int n,sum,mxt,ans = -1,l,r;
19
20 struct ACT
21 {
22     int take,dead;
23 }a[MAXN];
24
25 int cmp(ACT a,ACT b)
26 {
27     return a.dead < b.dead;
28 }
29
30 inline bool jud(int x)
31 {
32     for(int i = 1;i <= n;++ i)
33     {
34         if(x + a[i].take > a[i].dead)
35             return false;
36         else
37             x += a[i].take;
38     }
39     return true;
40 }
41
42 int main()
43 {
44     read(n);
45     for(int i = 1;i <= n;++ i)
46     {
47         read(a[i].take),read(a[i].dead);
48         sum += a[i].take;
49         if(a[i].dead > mxt) mxt = a[i].dead;
50     }
51     if(sum > mxt)
52     {
53         printf("-1\n");
54         return 0;
55     }
56     std::sort(a+1,a+1+n,cmp);
57     l = 0,r = mxt;
58     while(l <= r)
59     {
60         int mid = (l+r)>>1;
61         if(jud(mid)) ans = mid,l = mid+1;
62         else r = mid-1;
63     }
64     printf("%d\n",ans);
65     return 0;
66 }
时间: 2024-10-11 05:49:06

NOIP模拟 Problem 1 任务安排 题解的相关文章

NOIP模拟 B君的数组 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. %%%%%%%%%%%%%毕克dalao  Orzzzzzzzzzzzz 题目大意: 给出一个数组a,大小是2^k,下标从0开始. 求:对于每个x(0<=x<2^k),下标满足x&i = i的所有ai的和. 输入格式: 第一行有一个整数N,表示数组的大小. 接下来N行,每行一个整数,表示ai. 输出格式: 每行输出一个整数,表示所求答案. 输出共包含N行. 样例输入: 4 1 2 4 8 样例输出: 1 3 5 15

【noip模拟赛 化零】 题解

Describe 有5个集合,每个集合N个元素,从每个集合选出一个数,共5个,问是否可以使和为0. IN put: 第一行一个整数 N,表示集合的大小. 接下来五行每行 N个整数,表示这五个集合内的元素. OUT put: 如果能找到符合条件的五个数,则输出"YES",否则输出"NO". example: in 3 1 -2 9 -1 2 1 -3 5 1 -1 7 6 -4 -1 -7 out YES 数据范围: N<=20 30% N<=200 10

liu_runda 给辣鸡蒟蒻做的 NOIP模拟赛 1.0 第二题 任(duty) 题解

问题 B: 任(duty) 时间限制: 2 Sec  内存限制: 512 MB 题目描述 liu_runda退役之后就失去梦想开始咸鱼生活了- Bilibili夏日画板活动中,所有人都可以在一块画板上进行像素画创作.UOJ群有一群无聊的人决定在画板上创作一个50*50的UOJ的LOGO.如下图. 这块画板实际上是很大的矩形网格.一个网格是一像素. 一个人每三分钟才能画一个像素.所以liu_runda的咸鱼生活非常无聊. 郭神表示他实在是看不下去liu_rudna这只颓狗了,于是随手出了一道神题,

NOIP模拟17.9.21

NOIP模拟17.9.21 1 任务安排manage.in/.out/.cpp1.1 问题描述你有N 个工作,同一时刻只能做一个任务, 其中每个工作有其所需时间, 及完成的Deadline(截止时间), 问要完成所有工作, 最迟要从什么时候开始.你最早可以从时间0 开始工作.1.2 输入格式第一行一个整数N,表示任务数量接下来n 行,每行两个整数,Ti; Si,分别表示该任务的持续时间和截止时间.1.3 输出格式输出一个整数,表示最晚的开始时间,如果不能完成,输出-1.1.4 样例输入43 58

NOIP模拟17.8.17

NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 k 种字母.要求满足:• 字符串中相邻的两个字母不能相同.• 必须出现恰好 k 种不同的字母.这样的合法字符串可能有很多,小 L 让小 G 输出字典序最小的那个.小 G 太笨啦,不会做这道题,希望你帮帮他.[输入格

NOIP模拟 17.8.18

NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也需要一定量的草作为饲料对于第 i头奶牛来说,它每天可以产 vi升的奶,同时需要 wi千克的草作为饲料现在来自蚯蚓国的九条可怜想借一些奶牛,使借走的这些奶牛每天的总产奶量最大,但九条可怜很穷,每天最多只能提供W千克的草作为饲料,而且她还需要对付跳蚤国的神刀手,所以她把这个问题交给了阿强巴,不不不……阿

NOIP模拟 6.28

NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式]

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

NOIP模拟17.9.22

NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥ ??的位置去,但很不幸数轴上有??个区间是禁区,不能进入.青蛙会选择一个长度??,从原点开始每次向右跳长度为??的一段.一路上青蛙会停的位置是0, ??, 2??,…直到跳到了≥ ??的位置,任意一个位置都不能在禁区中.请求出??的最小值,注意??可以是实数.[输入格式]输入文件为susume.in.输入文件的第一行包含两个整数??和??,含义如问题描述中所述.接下来??行,每行描述一个禁区.每行有两个整数