zoukankan      html  css  js  c++  java
  • 【50.00%】【codeforces 747C】Servers

    time limit per test2 seconds
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output
    There are n servers in a laboratory, each of them can perform tasks. Each server has a unique id — integer from 1 to n.

    It is known that during the day q tasks will come, the i-th of them is characterized with three integers: ti — the moment in seconds in which the task will come, ki — the number of servers needed to perform it, and di — the time needed to perform this task in seconds. All ti are distinct.

    To perform the i-th task you need ki servers which are unoccupied in the second ti. After the servers begin to perform the task, each of them will be busy over the next di seconds. Thus, they will be busy in seconds ti, ti + 1, …, ti + di - 1. For performing the task, ki servers with the smallest ids will be chosen from all the unoccupied servers. If in the second ti there are not enough unoccupied servers, the task is ignored.

    Write the program that determines which tasks will be performed and which will be ignored.

    Input
    The first line contains two positive integers n and q (1 ≤ n ≤ 100, 1 ≤ q ≤ 105) — the number of servers and the number of tasks.

    Next q lines contains three integers each, the i-th line contains integers ti, ki and di (1 ≤ ti ≤ 106, 1 ≤ ki ≤ n, 1 ≤ di ≤ 1000) — the moment in seconds in which the i-th task will come, the number of servers needed to perform it, and the time needed to perform this task in seconds. The tasks are given in a chronological order and they will come in distinct seconds.

    Output
    Print q lines. If the i-th task will be performed by the servers, print in the i-th line the sum of servers’ ids on which this task will be performed. Otherwise, print -1.

    Examples
    input
    4 3
    1 3 2
    2 2 1
    3 4 3
    output
    6
    -1
    10
    input
    3 2
    3 2 3
    5 1 2
    output
    3
    3
    input
    8 6
    1 3 20
    4 2 1
    6 5 5
    10 1 1
    15 3 6
    21 8 8
    output
    6
    9
    30
    -1
    15
    36
    Note
    In the first example in the second 1 the first task will come, it will be performed on the servers with ids 1, 2 and 3 (the sum of the ids equals 6) during two seconds. In the second 2 the second task will come, it will be ignored, because only the server 4 will be unoccupied at that second. In the second 3 the third task will come. By this time, servers with the ids 1, 2 and 3 will be unoccupied again, so the third task will be done on all the servers with the ids 1, 2, 3 and 4 (the sum of the ids is 10).

    In the second example in the second 3 the first task will come, it will be performed on the servers with ids 1 and 2 (the sum of the ids is 3) during three seconds. In the second 5 the second task will come, it will be performed on the server 3, because the first two servers will be busy performing the first task.

    【题目链接】:http://codeforces.com/contest/747/problem/C

    【题解】

    一个任务一个任务地枚举
    因为时间是升序的、所以不用管。
    在枚举的时候看看这个任务开始的时候有哪些人是空闲的?
    ->如何确定某个人是否空闲???
    ->这个人完成任务的时间.
    每让一个人接任务过后,就记录每个人任务完成的时间是什么时候.
    时间复杂度O(n*q);

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define rei(x) scanf("%d",&x)
    #define rel(x) scanf("%I64d",&x)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int MAXP = 1e2+10;
    const int MAXQ = 1e5+10;
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    
    struct abc
    {
        int t,k,d;
    };
    
    int last[MAXP];
    abc a[MAXQ];
    int n,q;
    int b[MAXP];
    int ans[MAXQ];
    int sum[MAXP];
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        rei(n);rei(q);
        rep1(i,1,q)
        {
            rei(a[i].t);rei(a[i].k);rei(a[i].d);
        }
        rep1(i,1,q)
        {
            b[0] = 0;
            sum[0] = 0;
            rep1(j,1,n)
                if (last[j]<a[i].t)
                {
                    b[0]++;
                    b[b[0]] = j;
                    sum[b[0]] = sum[b[0]-1]+b[b[0]];
                    if (b[0]==a[i].k)
                        break;
                }
            if (b[0]==a[i].k)
            {
                ans[i] = sum[b[0]];
                rep1(j,1,b[0])
                    last[b[j]] = a[i].t + a[i].d-1;
            }
            else
                ans[i] = -1;
        }
        rep1(i,1,q)
            printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    Java 对象的序列化和反序列化
    Java 数组元素倒序的三种方式
    Java实现字符串倒序输出的几种方法
    sql ,内连接,外连接,自然连接等各种连接
    linux上 安装软件
    打乱数组
    java集合类
    我换了新博客啦
    代理模式
    抽象工厂模式
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626795.html
Copyright © 2011-2022 走看看