日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

均分纸牌问题

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 均分纸牌问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

均分紙牌有三種情況:線性,環形,二維

文章目錄

  • 線性
    • 題目描述
    • 思路:
    • 代碼:
  • 環形
      • 題目描述
      • 思路
      • 代碼

線性

題目描述

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;}

總結

以上是生活随笔為你收集整理的均分纸牌问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。