LA 4254 贪心

题意:有 n 个工作,他的允许的工作时间是 [l,r] ,工作量是 v ,求CPU最速度的最小值。

分析:

可能太久没有做题了,竟然脑子反应好慢的。还是很容易想到二分,但是二分怎么转移呢?

可以看出,[l,r] 的区间范围不大,可以枚举,cpu 此时的二分答案 x,尽可能的贪心,怎么贪心呢,在同一速度情况下,是最先结束的优先。

而且,这一时刻,他能做很多任务,当 x 很大时,就在这里用优先队列来贪心安排任务。

其实这个题目中的那个图还是有干扰的,因为时时刻刻都要CPU速度为x。

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e4+5;

struct Node {
    int l,r,v;
}p[maxn],u;

bool operator < (Node a,Node b)
{
    return a.r>b.r;
}

int cmp(Node a,Node b) {
    return a.l < b.l;
}

int L,R,sum;
int n;

bool check(int x) {
    priority_queue<Node> Q;
    int k = 0;
    for(int i = L; i <= R; i++) {
        int t = x;
        while(k!=n&&p[k].l<i) Q.push(p[k++]);

        while(!Q.empty()&&t!=0) {
            u = Q.top();
            Q.pop();
            if(u.r < i) return false;
            if(u.v>t) {
                u.v-=t;
                t = 0;
                Q.push(u);
            }
            else t-=u.v;
        }

    }
    if(Q.empty()) return true;
    else return false;
}

int main()
{
    freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);

        for(int i = 0; i < n; i++) {
            scanf("%d%d%d",&p[i].l,&p[i].r,&p[i].v);
            R = max(R,p[i].r);
            L = min(L,p[i].l);
            sum+=p[i].v;
        }

        sort(p,p+n,cmp);

        int ans;
        int l = 1,r = sum;
        while(l<=r) {
            int mid = (l+r)/2;
            if(check(mid)) {
                r = mid - 1;
                ans = mid;
            }
            else l = mid + 1;
        }
        printf("%d\n",ans);

    }
    return 0;
}

原文地址:https://www.cnblogs.com/TreeDream/p/8359513.html

时间: 2024-11-10 08:14:09

LA 4254 贪心的相关文章

LA 4254 Processor 处理器 【二分 贪心 优先队列】

题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21663 二分: 最大值最小的问题通过二分来求解.对处理器速度进行二分之后,问题就转化成了对于给定的处理速度,问处理器是否可以将这些问题处理完. 贪心: 一个贪心的思路就是每个时刻应该尽量 做可以做的任务中,结束时间最早的那个,这样最起码不会使结果更糟.这样就可以枚举每个单位时间,然后去找可以做的并且结束时间最早的那个去做,直到用完这一单位时间或者无任务可做为止.

LA 4254 处理器(二分+贪心)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2255 题意: 有n个任务,每个任务有3个参数ri,di和wi,表示必须在时刻[ri,di]之内执行,工作量为wi.处理器的速度可以为任意值,任务不一定要连续执行,可以分成若干块,求最大速度的最小值. 思路: 最大值的最小值问题可以考虑用二分法来做. 这道题目怎么判断速度合法是

LA 3266 (贪心) Tian Ji -- The Horse Racing

题意: 田忌和齐王各有n匹马,如果马的速度比齐王的快就赢200,慢则输200,相等不赔不赚. 已知两人每匹马的速度(为整数)和齐王所排出的马的顺序,问田忌该如何应对才能使收益最大. 分析: 本以为是一道很简单的贪心,上来就贪,结果什么都没贪出来. 看了题解才发现贪心是比较复杂的. 这里贴上poj某牛的神分析. 贪心策略: 1,如果田忌的最快马快于齐王的最快马,则两者比. (因为若是田忌的别的马很可能就赢不了了,所以两者比) 2,如果田忌的最快马慢于齐王的最快马,则用田忌的最慢马和齐王的最快马比.

LA 4636 (贪心) Cubist Artwok

题意: 一个由若干小正方体组成的图形,给出它的正视图和侧视图,求满足条件的最少小正方体的个数. 分析: 虽说是一道简单的贪心,可一直没有太好的思路. 又一次可耻地看了别人的题解. http://blog.csdn.net/u011345461/article/details/38491661 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxn = 25; 6

LA 4254 这个为什么会超时?

#include<iostream> #include<vector> #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; struct Line { int a,b,w; }; vector <Line> line; vector <Line> templine; int n; int workline[20010];

LA 4850 贪心

感谢SF巨和WH巨的指导.. 首先,YY得到一个结论,罚值最大的最小值必定是按照截止时间排序得到的.然后,选一个任务插到其他位置,必定产生罚值最大值更大的情况,但有可能产生两个罚值最大情况和更小的情况(此处感谢WH巨).然而,为什么不是选两个任务调动呢?因为必定会产生两个罚值更大的情况,情况会更坏. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> us

2015 暑假

2015.07.19 1 //2015.07.19 2 3 **********做的题目*********** 4 LA 4254 5 二分最小化最大值,check函数不好写---,是一秒一秒地来处理的 6 7 UVa 11627 8 二分,写check函数的时候,用到了一点点物理的平抛,求出下落的区间的范围,再判断是否可行 9 10 UVa 11134 11 贪心,优先队列, 12 行列无关,转化为对于[1,n]中的每一个数,判断i是否在区间[l,r]里面 13 然后贪心地选择包含i点的右端点

LA 4945 Free Goodies(贪心)

Description B  Free Goodies Petra and Jan have just received a box full of free goodies, and want to divide the goodies between them. However, it is not easy to do this fairly, since they both value different goodies differently. To divide the goodie

UVA LA 7146 2014上海亚洲赛(贪心)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=648&problem=5158&mosmsg=Submission+received+with+ID+1708713 /** UVA LA 7146 2014上海亚洲赛(贪心) 题目大意:给定敌我双方士兵的数量和每个士兵的攻击力和防守力,如果两个士兵对战,一方