NOIP模拟 Problem 1 任务安排 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于NOIP模拟 Problem 1 任务安排 题解的主要内容,如果未能解决你的问题,请参考以下文章

9.27NOIP模拟题

洛谷 U360 子矩阵 (NOIP模拟赛T1)题解

17.2.10 NOIP模拟赛 聪哥的工资

(CJOJ)P2634 - NOIP2017模拟失格

$NOIP 2016 Day1$ 模拟考试 题解报告

$NOIP 2018 Day2$ 模拟考试 题解报告