博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ CodeVS冲杯之路 ] P1098
阅读量:5310 次
发布时间:2019-06-14

本文共 973 字,大约阅读时间需要 3 分钟。

   不充钱,你怎么AC?

     题目:

 

     显然就是使每堆牌达到总体的平均数,尽量使每次移动时的牌数最大,这就类似于飞行棋,将几个棋子叠起来一起走是最优的。

     我们将数组变为关于平均数的浮动,然后每次寻找距离最小的一正一负的两个位置,将绝对值小的补上,也就是将其中一个变为0(若绝对值相等就是两个),再从多的往少的一个个标记,代表会往那边移动一次。注意这里要开一个左一个右,因为向左和向右是代表的两种不同得方案。那么这样我们就达到了每次移动牌数尽可能最多。可能思路讲的不是很清晰,具体请参考代码。

 

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define N 110 8 using namespace std; 9 10 struct data11 {12 int l,r;13 }14 f[N];15 int a[N];16 int main()17 {18 int i,n,k,sum,l,r;19 scanf("%d",&n);20 sum=0;21 for (i=1;i<=n;i++)22 {23 scanf("%d",&a[i]);24 sum+=a[i];25 f[i].l=f[i].r=0;26 }27 sum/=n;28 for (i=1;i<=n;i++) a[i]-=sum;29 l=r=1;30 while (1)31 {32 while (a[l]>=0&&l<=n) l++;33 while (a[r]<=0&&r<=n) r++;34 if (r>n||l>n) break;35 k=min(-a[l],a[r]);36 a[l]+=k;37 a[r]-=k;38 if (r>l) for (i=r;i>l;i--) f[i].l=1;39 else for (i=r;i

 

转载于:https://www.cnblogs.com/hadilo/p/5861112.html

你可能感兴趣的文章
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>
虚拟DOM
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
Spark的启动进程详解
查看>>
使用命令创建数据库和表
查看>>
机器视觉:SSD Single Shot MultiBox Detector
查看>>
201521123044 《Java程序设计》第1周学习总结
查看>>
MIT Scheme 的基本使用
查看>>
程序员的“机械同感”
查看>>
在16aspx.com上下了一个简单商品房销售系统源码,怎么修改它的默认登录名和密码...
查看>>
c++回调函数
查看>>
linux下Rtree的安装
查看>>
【Java】 剑指offer(53-2) 0到n-1中缺失的数字
查看>>
Delphi中ListView类的用法
查看>>
多米诺骨牌
查看>>
Linq 学习(1) Group & Join--网摘
查看>>