Google codejam Qualification Round 2015 B 巧妙枚举结果 + 贪心

背景:想了好久只想到用深搜的指数级别枚举办法来过了小数据,大数据自然超时,后来看了解题报告,才过。

思路:当前所有盘子中,煎饼个数最多的盘子里有n个煎饼,i 从 1 … n 枚举分裂之后的煎饼最多盘子里的个数,然后用贪心的方法计算要达到当前状态所需的最少分裂步数 k ,最后用时就是 i + k ,求出所有用时中最小的即可

感悟:这个题的精华之处是所有最终状态最多只有1000种,对于每种最终状态所需要的的步数又可以通过高效的贪心方法求出,思维很巧妙,算是暴力枚举和贪心的巧妙结合。

我的代码:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;

bool cmp(int a, int b) {return a > b;}

int main(void) {
    //freopen("B-large-practice.in", "r", stdin);
    //freopen("B-large-practice.out", "w", stdout);
    int T, n, pancake[1009], ans, key;
    scanf("%d", &T);
    for(int k = 1; k <= T; k++) {
        scanf("%d", &n);
        for(int i = 0; i < n; i++) scanf("%d", &pancake[i]);
        sort(pancake, pancake + n, cmp );
        if(pancake[0] <= 3) printf("Case #%d: %d\n", k, pancake[0]);
        else {
            ans = pancake[0];
            for(int i = pancake[0] - 1; i >= 1; i--) {
                key = i;
                for(int j = 0; j < n && pancake[j] > i; j++) {
                    key += ceil((double)pancake[j] / i) - 1;
                }
                if(key < ans) ans = key;
            }
            printf("Case #%d: %d\n", k, ans);
        }
    }
    return 0;
}
时间: 2024-12-17 03:57:55

Google codejam Qualification Round 2015 B 巧妙枚举结果 + 贪心的相关文章

Codejam Qualification Round 2019

本渣清明节 闲里偷忙 做了一下codejam 水平不出意外的在投稿之后一落千丈 后两题的hidden test竟然都挂了 A. Foregone Solution 水题,稍微判断一下特殊情况(比如1000, 5000这种)就好了 #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <climits> #include <cstr

DP VK Cup 2012 Qualification Round D. Palindrome pairs

题目地址:http://blog.csdn.net/shiyuankongbu/article/details/10004443 1 /* 2 题意:在i前面找回文子串,在i后面找回文子串相互配对,问有几对 3 DP:很巧妙的从i出发向两头扩展判断是否相同来找回文串 4 dpr[i] 代表记录从0到i间的回文子串的个数,dpl[i] 代表记录i之后的回文子串个数 5 两两相乘就行了 6 详细解释:http://blog.csdn.net/shiyuankongbu/article/details

Educational Codeforces Round 76 F 折半枚举

Educational Codeforces Round 76 F 折半枚举 https://codeforces.com/contest/1257/problem/F 题意: 数组a,找到一个x使得a中每一个元素异或x后"二进制中1的个数"相同. 数组长度100,数字大小2^30. 思路: 折半枚举答案X,如分为X前15位和后15位.之后我们再枚举期望的"相同个数"是多少,通过hash看看能不能满足就好了. 代码: #include <bits/stdc++

2015 Google code jam Qualification Round B 枚举 + 贪心

题意:给你一个无穷长的数列 和一些非 0 的值,可以进行两种操作. 1)数列中所有大于1的值 都减1 2)从 a[i] 中取出任意的值分给任意人. 问你最少执行多少步能使的 数列全为0. 解题思路:枚举最大的a[i].大于 a[i]的部分都分出去. 解题代码: 1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月11日 星期六 23时16分58秒 4 5 #include<vector> 6 #incl

2015 Google code jam Qualification Round A 水

题意:给你一个序列 从 0-n  初始位置为0 ,只能从 i 走到 i+1  你必要有的人数 >= i+1  ,每个位置有a[i]个人,问你走到 n 还需要多少个人. 解题思路:暴力 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月11日 星期六 23时06分57秒 4 5 #include<vector> 6 #include<list> 7 #include<

google code jam Round 1A 2015 Problem C. Logging

Problem A certain forest consists of N trees, each of which is inhabited by a squirrel. The boundary of the forest is the convex polygon of smallest area which contains every tree, as if a giant rubber band had been stretched around the outside of th

Topcoder open 2015 Round 1A 250 Similars 枚举 + 状压

题意:问你A-B之间 问你选两个数字 使得 这两个数字 相同 数字 个数最多 的 相同数字个数. 解题思路:枚举A-B之间所有的数,把数分解成10进制hash状态压缩,然后再把所有压缩后的值 N^2枚举找出最大值. 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "Similars.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #

Google Code Jam Round 1A 2015 Problem B. Haircut 二分

Problem You are waiting in a long line to get a haircut at a trendy barber shop. The shop has B barbers on duty, and they are numbered 1 through B. It always takes the kth barber exactly Mk minutes to cut a customer's hair, and a barber can only cut

google kcikstart 2018 round c

https://code.google.com/codejam/contest/4384486/dashboard#s=p0 A 题意 给定一个无向图,其中存在着唯一的一个环,求每个点到这个环的最短距离. 数据范围 ≤ T ≤ 100. 1 ≤ xi ≤ N, for all i. 1 ≤ yi ≤ N, for all i. xi ≠ yi, for all i. (xi, yi) ≠ (xj, yj), for all i ≠ j. The graph in which planets ar