均分纸牌问题
均分紙牌有三種情況:線性,環形,二維
 
文章目錄
- 線性
- 題目描述
- 思路:
- 代碼:
 
- 環形
- 題目描述
- 思路
- 代碼
 
 
線性
題目描述
P1031 均分紙牌
 有N堆紙牌,編號分別為1,2,…,N。每堆上有若干張,但紙牌總數必為N的倍數。可以在任一堆上取若干張紙牌,然后移動。
 移動規則:只能向相鄰的紙牌移動
 問最少移動多少次可以使紙牌數一樣多
思路:
第一堆只能給第二堆多干張,或者第二堆給第一堆,這取決于第一堆的初始牌量。當確定第一堆狀態后,我們就不用再考慮他,第二堆就變成新的第一堆。
 所以我們先求平均值(也就是最終每堆多少張),然后從第一堆開始往后一次比較,如果相等就跳過,如果不是,移動次數就加1
 比如:1 1 1 9
 平均值為3
 第四堆多6張,全部移動到第三堆,然后第三堆再移動四張到第二堆,第二堆再移動兩張到第一堆。一共三步
代碼:
#include<iostream> using namespace std; int a[10002]; //int jozky() //{//} int main() {int n,ave=0,sum=0;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];ave=ave+a[i];} ave=ave/n;for(int i=1;i<=n;i++){a[i]=a[i]-ave;//與平均值的距離 }for(int i=1;i<=n;i++){if(a[i] == 0) continue;sum++;a[i+1] = a[i]+a[i+1];//a是前綴和(表示前i堆與平均值的距離情況) }cout<<sum<<endl;return 0; }環形
P2512 [HAOI2008]糖果傳遞
題目描述
我們將上一個問題由線性改成環形,也就是第一位和最后一位是相鄰的,他們之間也可以互相給牌,這樣任意一位都有兩個臨點
 問最少代價是多少?挪動一張牌的代價是1
 (上一個題是問最少移動多少次)
思路
既然是環形,我們完全可以拆環成鏈,然后用上面那個題的方式來解決
 
 橙色圈住的部分我們都可以看做坐標上的點,那xn的絕對值我們就可以看做點x與橙色部分的距離,然后求最短距離和
 如果有偶數個點,就是最中間兩個點的平均
 如果是奇數,就是最中間的點
 橙色部分每個點之間的距離都是有規律的,代碼里有
代碼
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n; const int maxn=1e6+4; ll a[maxn]; int main() {cin>>n;ll sum=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}sum/=n;for(int i=n;i>1;i--){a[i]=sum-a[i]+a[i+1];//為啥是這個公式可以在我那個推到里面得到 }a[1]=0;sort(a+1,a+n+1);ll res=0;int mid=(n+1)/2;for(int i=1;i<=n;i++){res+=abs(a[i]-a[mid]);} cout<<res<<endl;return 0;}總結
 
                            
                        - 上一篇: 蓝牙技术|蓝牙远距离遥控,伦茨科技ST1
- 下一篇: python3调用js的库之execjs
