此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目大意:
你有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