• P4188 [USACO18JAN]Lifeguards S


    首先,一个都不开除时的总时间是很好求出来的。 考虑炒掉一个救生员对总时间的影响。很明显,假如这个救生员的工作时间刚好被另一个救生员所包含,那开掉他肯定最优。 假如没有包含的情况, 那么我们肯定要开掉**独立工作时间**最短的那个救生员。 至于每个救生员的**独立工作时间**怎么求, 首先给左端点排个序, 然后建议自己试一试时间线段之间的几种关系, 观察当前救生员对前一个救生员**独立工作时间**的影响就可以了。 ```cpp #include #include #include #include using namespace std; const int MAXN = 1e5 + 20; inline int read() { int x = 0; char ch = getchar(); while(!isdigit(ch)) ch = getchar(); while(isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x; }

    int N;
    struct Seg
    {
    int l, r, t;
    bool operator <(const Seg &rhs) const{
    return l < rhs.l;
    }
    }cow[MAXN];

    int main()
    {
    //freopen("p4188.in", "r", stdin);
    cin>>N;
    for(int i = 1; i <= N; i++){
    int l = read(), r = read();
    cow[i] = (Seg){l, r, r - l};
    }
    sort(cow + 1, cow + N + 1);

    int len = 0, p = 0; bool flag = false;
    for(int i = 1; i <= N; i++){
    	if(cow[i].r <= p) flag = true;
    	else {
    		len += min(cow[i].r - cow[i].l, cow[i].r - p);
    		cow[i].t = min(cow[i].r - p, cow[i].r - cow[i].l);
    		if(i > 1 && cow[i].l < p) cow[i - 1].t -= (p - cow[i].l); 
    		p = cow[i].r;
    	}
    }
    if(flag) cout<<len<<endl;
    else{
    	int del = (1 << 29);
    	for(int i = 1; i <= N; i++) del = min(del, cow[i].t);
    	cout<<len - del<<endl;
    }
    return 0;
    

    }

  • 相关阅读:
    忘记 jumpserver 超级用户密码
    Linux 安装 MySQL-5.7.23
    Linux下MySQL 8.0安装配置
    H3C 端口镜像设置
    node.js+express+jade系列七:富文本编辑框的使用
    node.js+express+jade系列六:图片的上传
    node.js+express验证码的实现
    node.js定时任务:node-schedule的使用
    node.js+express+jade系列五:ajax登录
    node.js+express+jade系列四:jade嵌套的使用
  • 原文地址:https://www.cnblogs.com/wsmrxc/p/9429316.html
Copyright © 2020-2023  润新知