信息学奥赛一本通(1320:【例6.2】均分纸牌(Noip2002))
1320:【例6.2】均分紙牌(Noip2002)
時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 12714 ??? 通過數: 6841
【題目描述】
有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)。
【輸入】
n(n?堆紙牌,1≤n≤100)
a1a2…an(n?堆紙牌,每堆紙牌初始數,l≤ai≤10000)。
【輸出】
所有堆均達到相等時的最少移動次數。
【輸入樣例】
4 9 8 17 6【輸出樣例】
3【分析】
? ? ? ? 如果你想到把每堆牌的張數減去平均張數,題目就變成移動正數,加到負數中,使大家都變成 0,那就意味著成功了—半。
? ? ? ? 拿例題來說,平均張數為 10,原張數 9,8,17,6,變為 -1,-2,7,-4,從左邊出發:要使第 1 堆的牌數 -1 變為 0,只需將 -1 張牌移到它的右邊(第 2 堆)-2 中;結果是 -1 變為 0,-2 變為 -3,各堆牌張數變為 0,-3, 7,-4;同理,繼續......
【參考代碼】
#include<stdio.h> int main() {int i,n,a[100],sum=0,count=0,avg;scanf("%d",&n);for(i=0;i<n;i++) //讀入各堆牌張數,求總張數sum{scanf("%d",&a[i]);sum+=a[i];}avg=sum/n;for(i=0;i<n;i++) //每堆牌的張數減去平均數a[i]-=avg;for(i=0;i<n-1;i++){if(a[i]!=0){count++;a[i+1]+=a[i];}}printf("%d\n",count);return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1320
總結
以上是生活随笔為你收集整理的信息学奥赛一本通(1320:【例6.2】均分纸牌(Noip2002))的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1412:二进制分类)
- 下一篇: 信息学奥赛一本通(1240:查找最接近的