地址:均分纸牌
真是醉了,看错一句话让整个题的复杂度上升了好多。。。
原题中“除1和N外的纸牌,可以向相邻的堆移动”,被窝看成“除1和N外的纸牌,可以任意的堆移动”。虽然最后的结果应该是一样的,不过思考路线变了好大。。
这道题的解法是从1到N扫描,对于第i堆纸牌,如果等于平均值则不需要处理,如果不等,则其与平均值的差值移到第i+1堆,操作数加1.可能会疑问那个差值可能是正可能是负,这没有关系,差值为正表示移牌到i+1,为负表示从i+1移牌到i,其操作数都是加1,所以可以等价。
#include<iostream>
using namespace std;
int main()
{
int n;
int avr;
int arr[105];
int sum=0;
int ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
sum+=arr[i];
}
//cout<<sum<<endl;
avr=sum/n;
for(int i=0;i<n;i++)
{
arr[i]=arr[i]-avr;
if(arr[i]!=0)
{
ans++;
//cout<<"ans "<<ans<<endl;
arr[i+1]+=arr[i];//将该摞牌多余的牌数放到下一摞
//cout<<arr[i+1]<<endl;
}
}
cout<<ans<<endl;
return 0;
}