3 solutions
-
3
贪心 算出平均值后 遍历一遍若当前数比平均数大时把多余的数交给下一位若当前的数小于平均数时就向下一位数借(不存在下一位数不借的情况)
#include<bits/stdc++.h> using namespace std; int main() { int n,sum=0,count=0; cin>>n; int i[n+1]; for(int c=0;c<n;c++){ cin>>i[c]; count+=i[c]; } count/=n; for(int c=0;c<n;c++){ if(i[c]<count){ i[c+1]-=count-i[c]; sum++; }else if(i[c]>count){ i[c+1]+=i[c]-count; sum++; } } cout<<sum; }
-
2
突然发现还没有人发题解
思路
用sum算出所有数字的和然后s为平均数 cnt记录移的次数 贪心可知 从左到右找当前牌堆数,大于平均数移出,小于平均数移入,都算一次操作,等于时不动,每次移动时都将该移动的牌移到下一个牌堆,应该移动的数为a[i]-s,最后输出结果
代码
#include<stdio.h> int main() { int n,a[105]={0},sum=0,s=0,cnt=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; } s=sum/n; for(int i=0;i<n;i++) { if(a[i]!=s) { cnt++; a[i+1]+=a[i]-s; } } printf("%d",cnt); return 0; }
-
0
题解
一开始以为直接判断前n-1项里不等于平均值就行了,事实证明我想多了。。。毕竟要是前面移动的时候刚好后面已经等于平均值了嘞(就比如说:12 8 11 9),对吧。 所以每次记录一下与平均值的差值,这里不管正负,然后for循环里判断前一个差值加上自己不等于平均值的时候,移动次数就++。
#include<bits/stdc++.h> using namespace std; int main(){ std::ios::sync_with_stdio(false); int n,sum=0,ans=0,t=0; cin>>n; int a[n]; for(int i=0;i<n;i++){ cin>>a[i]; sum+=a[i]; } int av=sum/n; for(int i=0;i<n-1;i++){ if(a[i]+t!=av){ t=a[i]+t-av; ans++; } else t=0; } cout<<ans<<endl; return 0; }
- 1
Information
- ID
- 111
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- # Submissions
- 115
- Accepted
- 51
- Uploaded By