zoukankan      html  css  js  c++  java
  • soj1193 那些年我们用过的网盘

    1193: 那些年我们用过的网盘

    Description

    现在越来越多的人将资料放到各大网盘上来备份自己的数据,但是学校的网速众所周知,是乌龟中的战斗龟。网络中心为了缓解大家的情绪,推出了校园网盘,我和我的小伙伴们都惊呆了。但是如何合理的设计,成了一个巨大的问题,大家能帮忙解决吗?

        学校一共有N个班级,每个有不同的人数A,网络中心共有M个网盘(大于班级数),现在想要给每个班级的每个人1G的存储量,为了能够很好的区分,一个网盘里面只能是同一个班级的学生,并且每个网盘至少都有一个学生。为了尽量节约资源,你能告诉网络中心每个网盘至少需要多大的容量才能满足要求吗?

    例如,这儿2个班级,分别为50人和70人;

    如果这里4个网盘。那么我们可以得出最少每个网盘需要35G的容量才能满足要求,每个班各占2个网盘;

    如果只有3个网盘,那么每个至少需要50G的容量,其中一个给50人班级,另外两个给70人的班级。

    Input

    含有多组数据

    第一行为N,M,其中0<N<10000,N=<M<1000000,分别代表班级数和网盘数

    接下来N行每行一个数A,分别代表每个班级的人数,0<A<2000000

    Output

    输出需要的最少容量,格式见样例

    Sample Input

    2  4
    50
    70
    2 3
    50
    70
    4 6
    120
    2680
    3400
    200
    

    Sample Output

    35
    50
    1700


    解法:二分答案

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int da[10010],n,m;
    int can(int x)
    {
    int i,tot=0;
    for (i=1;i<=n;i++)
    {
    tot+=da[i]/x;
    if (da[i]%x!=0) tot++;
    }
    if (tot>m) return 0;
    return 1;
    }
    int erfen(int a,int b)
    {
    int mid;
    if (a==b) return a;
    mid=(a+b)/2;
    if (can(mid)) return erfen(a,mid);
    else return erfen(mid+1,b);
    }
    int main()
    {
    int i,j,ma;
    while (scanf("%d%d",&n,&m)!=EOF)
    {
    cin>>da[1];
    ma=da[1];
    for (i=2;i<=n;i++)
    {
    cin>>da[i];
    if (da[i]>ma) ma=da[i];
    }
    cout<<erfen(1,ma)<<endl;
    }
    return 0;
    }

  • 相关阅读:
    Git学习笔记06-版本回退
    python3+selenium入门07-元素等待
    [cerc2017J]Justified Jungle
    [codeforces126B]Password
    计算几何基础模板
    floyd路径记录
    [数据结构复习]层序建立二叉树
    [patl2-011]玩转二叉树
    [poj3348]Cows
    [poj3347]Kadj Squares
  • 原文地址:https://www.cnblogs.com/mbcxm/p/3182878.html
Copyright © 2011-2022 走看看