均分纸牌的解析

版权声明:转载请注明原出处啦(虽然应该也没人转载): https://blog.csdn.net/hzk_cpp/article/details/82050953

题目:luogu1031.

题目大意:给定n堆纸牌,现在第1堆纸牌上的只能往2上移,第n堆纸牌只能往n-1上移,剩余第i堆的纸牌只能往i-1和i+1上移,现在问最少几次可以移到所有纸牌堆的牌数是相同的.

这道题直接就先取得所有纸牌堆的纸牌平均数,然后所有纸牌数都与这个平均数做一个差,然后不断往后移就可以了.

至于这个方法为什么可以,是因为当这个数为正数时,相当与把第i堆多余的纸牌往i+1移,而负数时则相当与把第i+1对往第i堆移,而最后一堆是由于保证有解,所以不会出现多余的情况.

代码如下:

#include<bits/stdc++.h>
  using namespace std;
#define Abigail inline void
typedef long long LL;
const int N=100000;
int a[N+9],n,sum,ans;
Abigail into(){
  scanf("%d",&n);
  for (int i=1;i<=n;i++)
    scanf("%d",&a[i]),sum+=a[i];
}
Abigail work(){
  sum=sum/n;
  for (int i=1;i<=n;i++){
    a[i]=a[i]-sum+a[i-1];
    if (!a[i]) continue;
    ans++;
  }
}
Abigail outo(){
  printf("%d\n",ans);
}
int main(){
  int T=1;
  while (T--){
    into();
    work();
    outo();
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/82050953
今日推荐