【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\n", ans);

    return 0;

}

   

时间: 2024-11-03 22:37:48

【VIJOS】P1401复制CS的相关文章

oracle 包,函数,过程,块的创建和执行及在java中执行(转)

SQL> create or replace procedure sp_guocheng1 is--如果有这个名字就替换  2  begin--执行部分  3  insert into guocheng values('liyifeng','liyifeng');  4  end;  5  /  --执行的意思 Procedure created 显示错误SQL> show error;Errors for PROCEDURE LIYIFENG.SP_GUOCHENG1: LINE/COL E

designer.cs 删除后怎么恢复?(复制aspx修改名字后重新生成页面)

项目需要,经常拷贝页面过来修改,老是遇到页面出各种问题,对常见问题总结如下: 1.修改页面命名空间: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="XXX文件名.aspx.cs" Inherits="XXX命名空间" %> 2.designer.cs 内命名空间如果没有改变,可以删除designer.cs从新新建,具体步骤: 删除掉.aspx.d

【vijos】1757 逆序对(dp)

https://vijos.org/p/1757 有时候自己sb真的是不好说... 我竟然想了半天都没想到这个转移. 我是有多傻.... 我们设f[i][j]表示1~i的排列且逆序对恰好是j的方案数. 显然我们只需要将i放进i-1排列中就行了. 而且发现i始终大于i-1 那么就好做了,我们只要将所有i放到i-1序列的位置的方案全都加起来即可,即: f[i][j]=sum{f[i-1][k], max{0, j-i+1}<=k<=j} 用前缀和搞搞就行了. #include <cstdio

【vijos】1763 Wormhole(贪心)

https://vijos.org/p/1764 首先第一个虫洞一定是建在1号点. 证明如下: 假设一个虫洞在a,一个在b,a<b,那么走到k点的最短距离为 min{|x1-xk|, |x1-xa|+|xj-xk|},注意到|x1-xa|+|xj-xk|中的|x1-xa|是常数,而且对后一个|xj-xk|无影响,那么显然|x1-xa|取最小,即a=1 如果还没理解的我猜你没看到题目的一句话(就像我一开始一样):第二行,N个递增的整数,依次表示N个城市的坐标. 然后我们就可以枚举第二个虫洞的位置了

文件的基本操作---复制/移动或删除文件

复制/移动或删除文件 File类的Copy/Move方法 1.将C盘根目录下的Text.txt文本文件复制到D盘根目录下 File.Copy("C:\\Text.txt","D:\\Text.txt"); 2.将C盘根目录下的Text.txt文本文件移动到D盘根目录下 File.Move("C:\\Text.txt","D:\\Text.txt"); 3.删除指定的文件 File.Delete("C:\\Text.t

Vijos P1404 遭遇战

背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC的人誓死不屈,即将于恐怖分子展开激战,准备让一个人守着A区,这样恐怖分子就不能炸掉服务器了.(一个人就能守住??这人是机械战警还是霹雳游侠?)但是问题随之出现了,由于DustII中风景秀丽,而且不收门票,所以n名反恐精英们很喜欢在这里散步,喝茶.他们不愿意去单独守在荒无人烟的A区,在指挥官的一再命令

微软SQLHelper.cs类 中文版

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Xml; using System.Collections; namespace LiuYanBanT { public class SqlHelper

【vijos】1789 String(组合计数+奇怪的题)

https://vijos.org/p/1789 我yy了一下发现我的方法没错啊,为嘛才80分.. 当n=k的时候,显然这是个排列就能做的,枚举一半必定有且只有一个另一半与之对应,所以直接做就行了. 当k是奇数的时候,我们可以假设有一个奇数长的模型,每一次向右移动一个,显然最前边和最后边.此前边和次后边以此类推,他们都是相等的,也就是说,这个序列一定由两个元素组成(可以相同)那么显然有m*m种方法 当k是偶数的时候,根据前边的分析,显然只有m种序列(每一种序列的元素是一模一样的) 我觉得这是对的

atitit.提升备份文件复制速度(1) -----分析统计问题and解决方案

atitit.提升备份文件复制速度(1) -----分析统计问题and解决方案 1. 现在的情形 1 2. 硬盘信息 大概50mb/s, 50iops 1 3. 统计小的文件比率 2 4. 复制速度估计.. 2 5. 小文件类型比率按照扩展名 2 6. 速度慢的原因:::iops太低的... 4 7. 解决之道::: 4 7.1. 提升到ssd 硬盘. 4 7.2. 清理垃圾 4 7.3. 清理重复文件 5 7.4. 移动pic/isho文件.. 5 7.5. 打包文件.. . 5 8. 清理后