博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
均分纸牌(NOIP2000senior)解题报告
阅读量:6615 次
发布时间:2019-06-24

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

均分纸牌(NOIP2000senior)

解题报告

 【题目描述】

     有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。
  移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
  现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
  例如 N=4,4 堆纸牌数分别为:
  ① 9 ② 8 ③ 17 ④ 6
  移动3次可达到目的:
  从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。

  【限制】

  对于100%的数据,n≤100,ai≤105

  【分析】

       题目着重说明纸牌总数是n的倍数是有意图的= =

       为了使每堆纸牌一样多,总和上面的条件,最好的情况当然是每堆都是平均数

       然后利用差分思想,ci表示第i堆纸牌数-平均数

       由于开头和结尾只能向右传递,所以我们可以贪心的认为每张纸牌都向右传递

       ci就利用到了,如果ci没有摆好,那就给后面的纸牌,记录一次

       例如题目样例:

        9  8  17  6

        显然平均数是10

        处理后为-1 -2 7 -4

        那么第一次处理就是i=1 修改为-1 -3 7 -4

        第二次处理就是i=2 修改为-1 -3 4 -4

        第三次处理就是i=3 修改为-1 -3 4 0

        显然只处理了三次,而答案也是3

        这里可以证明出只向右传递是可以使得纸牌均分的,因为向左传递传到1时又会向右传,所以不如都向右传

        代码很简陋

   【代码】

1 #include 
2 #include
3 using namespace std; 4 5 const int maxn=101; 6 7 int n,i,averge,ans,card[maxn]; 8 9 int main(){10 scanf("%d",&n);11 for(i=1;i<=n;i++){12 scanf("%d",&card[i]);13 averge+=card[i];14 }15 averge/=n;16 for(i=1;i<=n;i++)17 card[i]-=averge;18 for(i=1;i<=n;i++)19 if(card[i]){20 card[i+1]+=card[i];//这里为什么不用考虑传回第一个?想一想21 ans++;22 }23 printf("%d",ans);24 return 0;25 }

 

转载于:https://www.cnblogs.com/maopengsen/p/4328824.html

你可能感兴趣的文章
C语言算法--统计字符串中单词的个数
查看>>
30万奖金!还带你奔赴加拿大相约KDD!?阿里聚安全算法挑战赛带你飞起!
查看>>
英特尔凌琦:大数据带来的机遇和挑战
查看>>
2017——Linux崛起的时代
查看>>
Devstack — screen 调试工具的使用
查看>>
壮士断腕!WordPress宣布停止使用React
查看>>
WCF版的PetShop之二:模块中的层次划分[提供源代码下载]
查看>>
RabbitMQ常用命令
查看>>
阿里云中间件技术 促进互联网高速发展
查看>>
Fusion-io: 全闪存超大规模数据中心时代的到来
查看>>
LSI针对富士通服务器推出高密度SAS存储设备
查看>>
XtremIO推第二代设备 在块存储上增加文件特性
查看>>
什么是高可用性(HA)?HA是什么
查看>>
82岁成都“极客”老人将族谱“上云” 还想去杭州云栖大会见马云
查看>>
智能时代悄然到来 物联网称王将引爆传感器产业
查看>>
Palo Alto Networks推出云应用框架
查看>>
物理隔离计算机被USB蜜蜂刺破 数据通过无线信号泄露
查看>>
大数据安全分析成未来方向 360市场份额第一
查看>>
利用一点机器学习来加速你的网站
查看>>
安天研究报告:白象的舞步——来自南亚次大陆的网络攻击
查看>>