zoukankan      html  css  js  c++  java
  • 【VIJOS】P1401复制CS

    背景

    SQ CLASS的机房里流行玩CS,几乎每台电脑上的D盘都有(每台电脑只有C盘和D盘,C盘有硬盘保护卡保护)。SQ非常恼火,因为这严重影响了教学秩序。

    描述

    有一天,机房所有机器的D盘都被物理格式化了,也就是说CS全都没有了;而且局域网也被关闭了,也就是说网上邻居看不到其他机器了。

    但是,道高一尺,魔高一丈。一天,一个同学不知道使用了什么方法,在一台计算机的D盘上安装了CS。由于局域网不通了,其他同学没有办法通过网络复制。但是,现在有k根并口线,可以用来复制。一根并口线可以连接两台计算机;一台计算机只有一个并口,因此同一时刻只能连一根并口线。两台计算机如果用并口线连接了,就可以进行复制,但由于并口的传输速率较慢,所以复制一次CS要一个小时。

    需要注意的是:由于SQ对CS的深恶痛绝,他和他的助教将进行不定期的视察,次数为M视察期间并口线上不能传输数据,原来没有传完的CS也将遭到灭顶之灾。万幸的是,同学们获取了老师视察的时间总表。

    现在有n个同学要玩CS,开始时只有一台机器上有CS。使用这k根并口线,在其他的n-1台计算机上都装上CS。同学们希望尽快能一起玩,你能计算一下至少需要多少小时吗?
    (SQ:何时CS才能从机房消失?玩CS,以后可有的是时间啊!)

    格式

    输入格式

    N,k和M的值,中间以一个空格分开。(2≤n≤10E9, 1≤k≤10E9, 1≤M≤10E3)
    以下M行有A和B两个值,A代表视察开始的时间(小时),B代表视察持续的时间(小时)。

    输出格式

    一个整数,表示n台计算机上都复制好CS至少需要多少小时。(保留两位小数)

    样例1

    样例输入1[复制]

    8 3 2
    1.1 0.9
    4 1

    样例输出1[复制]

    6.00

    限制

    1 second

    提示

    一开始有一台已经装好。第0到1小时复制出1台,一共2台有了。第1到1.1小时,复制中。第1.1到2小时,老师视察。第2到3小时,两台可以同时又复制出两台。第3-4小时,由于只有3根并口线,所以只能在复制出3台,一共7台好了。所以还需要一个小时(5.0-6.0)。

    来源

    SQ CLASS公开编程竞赛2008——Problem A
    Source: SQ, liuichou, royZhang

    题解:
      题目名挺好玩的……离散化+模拟(居然自己YY的两发就A了)模拟水平已经差到一定程度了……
      大约就是找出老师的巡查间隔作为连续的区间……重叠的部分直接预处理的时候离散化一下就ok
      然后就是注意各种细节,比如巡查完成后没跳出循环什么的……还有转int的时候什么的(离散化之前我转了int就水了1个点)
      模拟的题还是要想清细节啊
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    using namespace std;
    const int MAXN = 1001;
    struct MyStruct
    {
        double l, r;
    }a[MAXN],tls[MAXN];
    bool operator<(MyStruct a, MyStruct b)
    {
        if (a.l == b.l) return a.r < b.r;
        return  a.l < b.l;
    }
    int n, m, k;
    int main(int argc, char *argv[])
    {
        int i, j, cnt=1;
        scanf("%d%d%d", &n, &k, &m);
        for (i = 1; i <= m; i++)
        {
            scanf("%lf%lf", &a[i].l, &a[i].r);
            a[i].r += a[i].l;
            //a[i].l = (int)a[i].l;
            //a[i].r = (int)a[i].r + 1;
        }
        sort(a + 1, a + m + 1);
        tls[1] = a[1];
        for ( i = 2; i <= m; i++)
        {
            if (a[i].l <= tls[cnt].r)
            {
                tls[cnt].l = min(tls[cnt].l, a[i].l);
                tls[cnt].r = max(tls[cnt].r, a[i].r);
            }
            else
            {
                cnt++;
                tls[cnt].l = a[i].l;
                tls[cnt].r = a[i].r;
            }
        }
        //for (i = 1; i <= cnt; i++)
            //cout << tls[i].l << ' ' << tls[i].r << endl;
        int now = 0;
        double maxi = 0,ans=0;
        int num_copy = 1;
        i = 1;
        bool flag = false;
        while (now <= n)
        {
            int len = (int)(tls[i].l - ans);
            for (j = 1; j <= len; j++)
            {
                now += num_copy;
                num_copy *= 2;
                if (num_copy > k) num_copy = k;
                ans++;
                if (now >= n)
                {
                    flag = true;
                    break;
                }
            }
            if (flag == truebreak;
            ans = max(ans, tls[i].r);
            i++;
            if (i > cnt)
            {
                while (now <= n)
                {
                    now += num_copy;
                    num_copy *= 2;
                    if (num_copy > k)
                        num_copy = k;
                    ans++;
                }
            }
        }
        printf("%.2f ", ans);
        return 0;
    }
     
        
  • 相关阅读:
    【Qt开发】01-第一个Qt程序Hello World!
    Git使用总结(三):协同开发常见冲突
    公钥、私钥、数字签名、数字证书、对称与非对称算法、HTTPS
    通俗理解TCP的三次握手
    Flink安装极简教程-单机版
    程序员工资那些事!
    vim实战:插件安装(Vundle,NerdTree)
    Git使用总结(二):分支管理
    Git使用总结(一):简介与基本操作
    C++11并发编程:多线程std::thread
  • 原文地址:https://www.cnblogs.com/BeyondW/p/5915178.html
Copyright © 2011-2022 走看看