• [C++]Infinite House of Pancakes——Google Code Jam 2015 Qualification Round


    Problem

    It’s opening night at the opera, and your friend is the prima donna (the lead female singer). You will not be in the audience, but you want to make sure she receives a standing ovation – with every audience member standing up and clapping their hands for her.

    Initially, the entire audience is seated. Everyone in the audience has a shyness level. An audience member with shyness level Si will wait until at least Si other audience members have already stood up to clap, and if so, she will immediately stand up and clap. If Si = 0, then the audience member will always stand up and clap immediately, regardless of what anyone else does. For example, an audience member with Si = 2 will be seated at the beginning, but will stand up to clap later after she sees at least two other people standing and clapping.

    You know the shyness level of everyone in the audience, and you are prepared to invite additional friends of the prima donna to be in the audience to ensure that everyone in the crowd stands up and claps in the end. Each of these friends may have any shyness value that you wish, not necessarily the same. What is the minimum number of friends that you need to invite to guarantee a standing ovation?

    Input

    The first line of the input gives the number of test cases, T. T test cases follow. Each consists of one line with Smax, the maximum shyness level of the shyest person in the audience, followed by a string of Smax + 1 single digits. The kth digit of this string (counting starting from 0) represents how many people in the audience have shyness level k. For example, the string “409” would mean that there were four audience members with Si = 0 and nine audience members with Si = 2 (and none with Si = 1 or any other value). Note that there will initially always be between 0 and 9 people with each shyness level.

    The string will never end in a 0. Note that this implies that there will always be at least one person in the audience.

    Output

    For each test case, output one line containing “Case #x: y”, where x is the test case number (starting from 1) and y is the minimum number of friends you must invite.

    Limits

    1 ≤ T ≤ 100.
    Small dataset
    0 ≤ Smax ≤ 6.

    Large dataset
    0 ≤ Smax ≤ 1000.

    Sample

    Input 
    4
    4 11111
    1 09
    5 110011
    0 1
    
    Output 
    Case #1: 0
    Case #2: 1
    Case #3: 2
    Case #4: 0

    In Case #1, the audience will eventually produce a standing ovation on its own, without you needing to add anyone – first the audience member with Si = 0 will stand up, then the audience member with Si = 1 will stand up, etc.

    In Case #2, a friend with Si = 0 must be invited, but that is enough to get the entire audience to stand up.

    In Case #3, one optimal solution is to add two audience members with Si = 2.

    In Case #4, there is only one audience member and he will stand up immediately. No friends need to be invited.

    开始我花了很多时间在尝试自己所认为的最优分割方案,到最后才发现其实暴力的算法也是很好的。

    所要花费的时间最多为一个盘子中最多的pancake数量,最小时间>=1,因此只要把时间 i 从1~最大值的情况计算一遍,即先把所有盘子里的pancake都分一下,直到每个盘子里pancake数量都小于等于i,记录下这样要花费的时间。

    最后输出最短时间。

    #include<fstream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    
    int main(){
    
        ifstream in("b.in");
        ofstream out("b.out");
        int T;
        in >> T;
        for (int t = 0; t < T; t++){
            int N;
            in >> N;
            vector<int> num(N);
            for (int j = 0; j < N; j++){
                in >> num[j];
            }
            //从大到小排序
            sort(num.begin(), num.end(), isgreater<int, int>);
            int max = num[0];   //最大值
            int min = max;      //记录最短用时
            int sum = 0;
            //从1到最大值遍历
            for (int i = 1; i <= max; i++) {
                sum = i;
                for (int j = 0; j < N; j++) {
                    if (num[j] > i) {
                        //对pancake数大于i的分出,
                        //使其数量<=i,
                        //对sum加上分pancake的次数。
                        if (num[j] % i == 0)
                            sum += (num[j] / i - 1);
                        else
                            sum += (num[j] / i);
                    }
                }
                if (sum < min)
                    min = sum;
            }
            out << "Case #" << t + 1 << ": " << min << endl;
        }
        in.close();
        out.close();
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Forms身份验证和基于Role的权限验证
    构建高扩展性网站
    多态和继承(继承)
    MVC使用Bootstrap
    使用Navicat Premium 和PLSQL Developer连接Oracl
    内存排查 valgrind
    MVC Bootstrap Helpers
    IOS各种调试
    JavaScript 奇技淫巧
    深入理解Linux修改hostname(转)
  • 原文地址:https://www.cnblogs.com/xiaff/p/4856503.html
Copyright © 2020-2023  润新知