CodeForces Round #140(226B) - Naughty Stone Piles
来源:互联网 发布:怎么查看淘宝开店时间 编辑:程序博客网 时间:2024/05/21 11:00
这种范围的数据..贪心噜..关键是要逆转思维..从后往前想...
如果没有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;}
- CodeForces Round #140(226B) - Naughty Stone Piles
- 【贪心】CodeForces Round #140(226B) - Naughty Stone Piles
- Codeforces Round #140 (Div. 1) B Naughty Stone Piles
- Codeforces 226B Naughty Stone Piles 贪心
- Codeforces Round #140 (Div. 1) Naughty Stone Piles 贪心
- #140 (div.1) B. Naughty Stone Piles
- Codeforces Round #136 B
- Codeforces Round #239 --B
- Codeforces Round #300 B
- codeforces round # 412B
- Codeforces Round #425 B
- Codeforces Round #438 B
- Codeforces Round #439 B
- Codeforces Round #439 B
- Codeforces Round #397 B
- Codeforces Beta Round #60-B
- Codeforces Beta Round #2 B
- codeforces round 176Div1 B
- 构造函数和析构函数能否声明为虚函数?
- 虚析构函数存在的理由
- 企业版IDP的申请及“In House”发布
- QTabWidget
- TCP/IP的三次握手连接和四次握手关闭
- CodeForces Round #140(226B) - Naughty Stone Piles
- label标签的for属性用法
- Q_OBJECT宏的作用
- POJ 3304 Segments
- 为什么有的人飞黄腾达,有的人穷困潦倒 .
- Objective-C 属性关键字(assign , retain , copy , readonly , readwrite , atomic , nonatomic)
- JVM系列(二)——类加载
- 建造者模式
- vmware workstation 9注册码