HDU 5933/思维

题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=5933];

题意:

  给出n堆物品,问能不能分成K个数量相等的堆,如果能分,则最少次数是多少。分的规则为:1、将一个堆分成相邻的两个堆。2、将相邻的两个堆合并。Power oj 。均分纸牌。

#include<bits/stdc++.h>
const int maxn = 1e5+50;
typedef long long LL;
LL T,n,k;
LL a[maxn];
int main ()
{
    int ic = 0;
    scanf("%lld",&T);
    while(T--)
    {
        LL sum = 0,ans = 0;
        scanf("%lld%lld",&n,&k);
        for(int i = 1;i <= n;i++)
        {
            scanf("%lld",&a[i]);
            sum += a[i];
        }
        if(sum % k)
        {
           printf("Case #%d: -1\n",++ic);
        }
        else
        {
            sum /= k;
            for(int i = 1;i <= n;i++)
            {
                if(a[i]==sum||!a[i])
                    continue;
                if(a[i]>sum)
                {
                    ans++;
                    a[i]-=sum;
                    i--;
                }
                else
                {
                    a[i+1]+=a[i];
                    a[i]=0;
                    ans++;
                }
            }
            printf("Case #%d: %lld\n",++ic,ans);
        }

    }
    return 0;
}
时间: 2024-09-28 19:26:23

HDU 5933/思维的相关文章

HDU 5933 ArcSoft&#39;s Office Rearrangement 【模拟】(2016年中国大学生程序设计竞赛(杭州))

ArcSoft's Office Rearrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3    Accepted Submission(s): 2 Problem Description ArcSoft, Inc. is a leading global professional computer photogra

hdu 4883 思维题

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4883 TIANKENG’s restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 566    Accepted Submission(s): 267 Problem Description TIANKENG manages a

hdu 5014 思维题/推理

http://acm.hdu.edu.cn/showproblem.php?pid=5014 从小数开始模拟找方法规律,然后推广,尤其敢猜敢尝试,错了一种思路继续猜-----这是一种很重要的方法啊 这道题还是从小数开始模拟,我是根据16以内的找的规律 根据 2^k---2^k-1 2^k+1---2^k-2 ... 这样陪下去 当2^k==n的时候, 从2^(k-1)按同样的方法配下去, WA了很久,是lower_bound用错了 不过没明白为啥  换成upper_bound也可以AC....但

hdu 6058 思维

题目:http://acm.hdu.edu.cn/showproblem.php?pid=6058 分析题目的时候,由于枚举的区间很多,而第k大的值范围小,应该要想到去枚举第k大的值然后找到这个值对答案的贡献. 题解:我们只要求出对于一个数x左边最近的k个比他大的和右边最近k个比他大的,扫一下就可以知道有几个区间的kk大值是xx.(这个地方自己举几个例子就知道了) 我们考虑从小到大枚举x,每次维护一个链表(我写了一个双链表),链表里只有大于x的数,每次求x对答案的贡献的时候,直接在链表中x的位置

hdu 4810 思维题+二进制位规律+异或规律 213南京现场赛题

http://acm.hdu.edu.cn/showproblem.php?pid=4810 以前做过一些涉及异或的题,化为二进制形式,然后统计0,1个数是一种很常见的处理方法,但是在做这个题的时候居然没尝试,脑残啊...... 一开始看5s时限,感觉稍微暴力一点应该可以,于是YY的O(n^3)算法但是没去实现,明显超时啊,大致就是通过C(n,1)的组合可以在O(n^2)内处理出C(n,2)的组合,在通过C(n,2)处理出C(n,3)的组合....但是C(n,2)已经是n^2个数了,所以算法是O

hdu 5791 思维dp

题目描述: 求序列A,B的公共子序列个数: 基本思路: 想到了dp,选的状态也对,但是就是就是写不出状态转移方程,然后他们都出了,到最后我还是没出,很难受,然后主要是没有仔细考虑dp[i][j],dp[i][j-1],dp[i-1][j],dp[i-1][j-1]在A[ i]和B[i]在相同和不相同是的数量关系,我为啥就没想到要减呢,只想着怎么把他们加起来,着实智障: 定义状态dp[i][j]为序列A扫到i,序列B扫到B时候的公共子序列个数,状态转移方程如下: 其实这个状态转移方程也没那么好证明

HDU 1284 思维上的水题

其实如果想出了方法真的好水的说... 然而一开始想了好久都没想出来... 最后看了一下最大数据才32768 可以直接枚举...枚举每个硬币的数量 看看后来能不能凑够n 因为还是怕超时..(虽然只有3乘十的四次方)所以先枚举三分 然后二分 最后一分肯定足够 就不用了 自己好傻... #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h&

hdu 5491 思维题

#include<stdio.h> #include <math.h> #include <algorithm> #include <math.h> #include <string.h> #include <bitset> #include <iostream> using namespace std; #define LL long long void out(LL x) { bitset<32>s(x);

Just Random HDU - 4790 思维题(打表找规律)分段求解

Coach Pang and Uncle Yang both love numbers. Every morning they play a game with number together. In each game the following will be done:  1. Coach Pang randomly choose a integer x in [a, b] with equal probability.  2. Uncle Yang randomly choose a i