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;
    }
  • 相关阅读:
    rsync命令 SCP命令
    Linux 性能分析 工具命令
    ntp时间服务器 时间同步
    Linux 邮件服务
    linux 手工释放内存 高内存 内存回收 方法思路
    LVM 逻辑卷 (logica volume manager)
    Linux 磁盘原理与管理 (分区 挂载)
    linux中查看nginx、apache、php、mysql配置文件路径
    shell脚本 监控ps 不存在则重启
    Shell脚本 一键重启
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626795.html
Copyright © 2011-2022 走看看