• BZOJ_1620_[Usaco2008_Nov]_Time_Management_时间管理_(二分+贪心)


    描述


    http://www.lydsy.com/JudgeOnline/problem.php?id=1620

    N个工作,每个工作其所需时间,及完成的Deadline,问要完成所有工作,最迟要什么时候开始.

    分析


    我们可以想到二分开始的时间.对于一个给定的时间,判断是否可以完成.

    如何判断呢?

    我们假设有(a,b)两个任务且(deadline(a)<deadline(b)).

    如果先完成(b),那么要求(time[b]+time[a]<deadline(a)).

    如果先完成(a),那么要求(time[a]<deadline(a),time[a]+time[b]<deadline(b)).

    显然第二种方案完成的可能性更大,所以我们贪心的选择每次先完成(deadline)小的任务.

     1 #include <bits/stdc++.h>
     2 #define fst first
     3 #define scd second
     4 using namespace std;
     5 
     6 typedef pair <int,int> P;
     7 const int maxn=1000+5;
     8 int n,Max=~0u>>1;
     9 P a[maxn];
    10 inline int read(int &x){x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x*=k;}
    11 inline bool cmp(P a,P b){ return a.scd<b.scd; }
    12 inline bool C(int x){
    13     for(int i=1,t=x-1;i<=n;i++){
    14         t+=a[i].fst;
    15         if(t>=a[i].scd) return false;
    16     }
    17     return true;
    18 }
    19 inline int bsearch(int l,int r){
    20     while(l<r){
    21         int mid=l+(r-l+1)/2;
    22         if(C(mid)) l=mid;
    23         else r=mid-1;
    24     }
    25     return l;
    26 }
    27 inline void init(){
    28     read(n);
    29     for(int i=1;i<=n;i++) read(a[i].fst), read(a[i].scd), Max=min(Max,a[i].scd-a[i].fst);
    30     sort(a+1,a+n+1,cmp);
    31 }
    32 int main(){
    33     init();
    34     int ans=bsearch(0,Max);
    35     if(ans==0) ans=-1;
    36     printf("%d
    ",ans);
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    vue promise
    vue 数组操作
    vue登录注册切换的坑
    筆記連接
    vue配置jquery和bootstarp
    css的寬高約束
    css框模型
    css居中flex
    css居中
    遍历forEach与map的区别-forEach踩坑记
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5612192.html
Copyright © 2020-2023  润新知