CodeForces Round #140(226B) - Naughty Stone Piles

    这种范围的数据..贪心噜..关键是要逆转思维..从后往前想...

    如果没有k的限制条件..显然用最大石头数的堆不动..其他的堆往上加..那么答案是总石头数-最大堆的石头数..

    加上k的限制条件.一个石头堆直接移动到最大石头堆中..是1次移动..若其先与其他石头堆合并一次..在同那堆石头一起加到最大石头堆中..实际相当于移动了两次...若其先先合并了k次.. 再加到最大石头堆中..那么这堆移动成功的代价是其石头数*(合并数+1)..为了使得总的代价最小..那么期望的是石头数越大的堆合并的次数越少..

    若限制了每堆石头上只能覆盖k堆..对于最大石头堆...其上面的k堆..必然是除了最大石头堆的后k大的堆唯一一次移动...而这k大堆上每个又能容纳k个石头堆.那么就有k^2的堆是移动了两次的...同理..又有k^3个石头堆是移动了3次的...

    由此...要求n个石头堆..限制为k时的算法复杂度为 log(k,n)... 但是..要注意k=1的情况..因为不会发生指数增长..所以速度会慢..会超时..但是对于k=1的情况..是可以方便算出来的..特判一下就好了...


Program:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<map>
#include<queue>
#include<stack>
#define ll long long
#define oo 2000000000
#define pi acos(-1)  
using namespace std;
ll i,n,m,q,a[100005],s[100005],k,p,data,ans;
int main()
{  
    while (~scanf("%I64d",&n)) 
    {  
            for (i=1;i<=n;i++) scanf("%I64d",&a[i]);   
            sort(a+1,a+1+n); 
            s[0]=0;
            for (i=1;i<=n;i++) s[i]=s[i-1]+a[i];
            data=0;
            for (i=n-1;i>=1;i--) data+=a[i]*(n-i);
            n--;
            scanf("%I64d",&q);
            while (q--)
            {
                  scanf("%I64d",&i);  
                  if (i!=1)
                  {
                         p=1;  k=i;   ans=0;
                         m=n;
                         while (m>=k)
                         {
                               ans+=p*(s[m]-s[m-k]);
                               m-=k;
                               k*=i;
                               p++;
                         }
                         ans+=p*s[m];
                  }else  ans=data;
                  printf("%I64d ",ans);
            }
            printf("\n");
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值