Voltage Keepsake CodeForces - 801C(思维)

题意:

  有n台机器,第i台机器每个单位时间消耗ai的功率,初始有bi的功率储备,有一个充电器每个单位时间充p单位的功率 

  问经过多长时间才能有一个功率位0的机器,如果能够无限使用输出-1;

解析:

  时间是实数范围内,所以可以在任何时刻 给任何一个机器充电

  所以如果p >= sum(a1 + a2 + a3 + ``` + an) 则能无限使用

  如果不能无限使用 那么给所有的机器在不充电的情况下以初始能用多长时间从小到大排序

  那么我们首先肯定要给使用时间最小的机器充电,使它用的时间能够大于等于时间第二小的机器

  如果大于等于了。。。那是不是就要考虑 这两个机器的使用时间 看看能否让它们的使用时间大于等于使用时间第三小的机器 以此类推

  如果到了某个机器不符合了  那么使用时间就为t当前机器 + X  (其中X为在供不应求的情况下还能用多长时间)

  X = pow /(double) (x_p - p)  (其中pow为累计的多余功率, x_p为满足当前机器后每单位时间的消耗功率, p是每单位的充电量)

  x_p 每次累加a就好了(如果可以到达当前机器的时间)

  那pow怎么求。。。。。

  pow += (Node[i+1].t - Node[i].t) * (p - x_p)   就是加上一段时间里充的 减去 消耗的和 每次累加

  

#include 
using namespace std;
const int maxn = 1e6+10, INF = 0x7fffffff;
typedef long long LL;
int n, m, p;
struct node
{
    int a, b;
    double t;
}Node[maxn];

double cmp(node x, node y)
{
    return x.t < y.t;
}

int main()
{
    cin >> n >> p;
    LL sum = 0;
    for(int i=0; i)
    {
        cin >> Node[i].a >> Node[i].b;
        Node[i].t =  Node[i].b / (double)Node[i].a;
        sum += Node[i].a;
    }
    if(p >= sum)
        return puts("-1"), 0;
    sort(Node, Node+n, cmp);

    double pow = Node[0].t * p, x_p = Node[0].a;
    double ret = 0;
    int i, flag = 0;
    for(i=0; i1; i++)
    {
        if(pow + (Node[i+1].t - Node[i].t) * p > (Node[i+1].t - Node[i].t) * x_p)
            pow += (Node[i+1].t - Node[i].t) * (p - x_p), x_p += Node[i+1].a;
        else
        {
            ret = pow /(double) (x_p - p);
            flag = 1;
            break;
        }
    }
    if(!flag)
        ret = pow /(double) (x_p - p);
    if(n == 1)
        ret = pow /(double) (x_p - p);
    ret += Node[i].t;
    printf("%.10f\n", ret);



    return 0;
}

 

转载于:https://www.cnblogs.com/WTSRUVF/p/9687359.html

你可能感兴趣的:(Voltage Keepsake CodeForces - 801C(思维))