21 条题解
-
18
P1023题解
题目大意
存在n个整数,求将这n个整数变成一样大需要移动的数字之和。
完整思路如下
计算n个数的平均数t,累加所有比平均数大的数a[i]中,比平均数大的那部分数值a[i]-t
AC代码
#include <bits/stdc++.h> using namespace std; //By 洋葱头 int a[10001], sum, num; int main() { int n; cin >> n; for(int i = 1; i <= n; i++) { cin >> a[i]; sum += a[i]; } sum /= n; for(int i = 1; i <= n; i++) { num += abs(sum - a[i]); } cout << num / 2; return 0; }
大哥大嫂点个赞吧
-
11
P1023 干草堆
题目描述
核晶学院后勤部将干草打包成了一个个正方体,称它为干草捆,每个干草捆高度相同都为11,干草捆叠起来称为干草堆。
后勤部在晾晒干草时,将所有干草打包成若干个干草捆并分成n个等高的干草堆,但是调皮的学生们在干草堆之间移动了一些干草捆,使得各个干草堆的高度可能不相同了。
现在给出所有干草堆的高度,请帮后勤部确定,为了使所有干草堆恢复到原来相同的高度,至少要移动的最小干草捆数量。
思路
这个就是将每个数与之前算出的平均值比较一下,然后把那些数加起来 / 2,就可得出答案。
不过由于有的算出来是负数,所以肯定要用
abs函数
过一下。可以这样实现:
for(int i = 1;i <= n;i++) { num += abs(sum - a[i]); }
参考代码
#include <iostream>//hetao3097453 using namespace std; int a[10001],sum,num; int main() { int n; cin >> n; for(int i = 1;i <= n;i++) { cin >> a[i]; sum += a[i]; } sum /= n; for(int i = 1;i <= n;i++) { num += abs(sum - a[i]); } cout << num / 2; return 0; }
hetao3097453
2023年4月21日
-
3
一个赞拿走
#include <bits/stdc++.h> using namespace std; int a[10001],sum,num; int main() { int n; cin >> n; for(int i = 1;i <= n;i++) { cin >> a[i]; sum += a[i]; } sum /= n; for(int i = 1;i <= n;i++) { num += abs(sum - a[i]); } cout << num / 2; return 0; }
笑话时间到(3个) 1:朋友说我有双下巴了,都是经常低头刷手机导致的。从那之后,每次刷手机我都举高高地往上看。没想到,一个月之后我有了抬头纹。 2:一个推销员对一个家庭主妇喋喋不休地把他所有的产品都做了介绍,然后问:您看你缺什么?主妇不快地答道:缺钱。推销员从兜里掏出一张名片,说道:小额贷款了解一下…… 3:听说戒烟能延长十年的寿命,于是我反复的戒烟、吸烟、戒烟又吸烟,长生不老的秘诀被我找到了。 笑话结束,点个赞吧,求求了; 下一个题更新一个恐怖故事,期待吧。。。。。。
-
1
P1023
-题目描述-
核晶学院后勤部将干草打包成了一个个正方体,称它为干草捆,每个干草捆高度相同都为11,干草捆叠起来称为干草堆。 后勤部在晾晒干草时,将所有干草打包成若干个干草捆并分成n个等高的干草堆,但是调皮的学生们在干草堆之间移动了一些干草捆,使得各个干草堆的高度可能不相同了。 现在给出所有干草堆的高度,请帮后勤部确定,为了使所有干草堆恢复到原来相同的高度,至少要移动的最小干草捆数量。
-分析-
先计算n个数的平均数,再将每个数距离平均数的距离计算出来,因为有多的就有少的,所以最后除以2就可以了。
-核心代码-
sum /= n; for(int i = 1; i <= n; i++) { num += abs(sum - a[i]); } cout << num / 2;
-
1
这道题我一开始思路没问题,结果后面走偏了,幸亏又走回正轨 首先,每个干草堆高度肯定是一个平均值,因为我们要把每一堆变成平均值,
所以我们要把每一堆变成平均值所以我们要将平均值与每一项比较,求出的非负整数差累加,说明有多少干草捆不合格(多或少),但因为我们移动一个干草捆就去除掉两个不合法的干草捆,所以结果要除以2上菜!!!(已AC,请放心食用)
#include <iostream> using namespace std; int main(){ int n,a[10001],sum=0,ans=0; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; sum+=a[i]; } const int avg=sum/n; for(int i=1;i<=n;i++){ ans+=abs(avg-a[i]); } cout<<ans/2<<endl; return 0; }
提示!!!比C++98晚期的应该能过,如果是C++98就是:
#include <iostream> #include <algorithm>//C++98里avg还在algorithm里 using namespace std; int main(){ int n,a[10001],sum=0,ans=0; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; sum+=a[i]; } const int avg=sum/n; for(int i=1;i<=n;i++){ ans+=abs(avg-a[i]); } cout<<ans/2<<endl; return 0; }
-
1
#include <bits/stdc++.h> using namespace std; int main() { int a[10005]; int n,sum = 0,avg = 0; cin >> n; for (int i = 1;i <= n;i++) { cin >> a[i]; sum += a[i]; } avg = sum / n; int move = 0; for (int i = 1;i <= n;i++) { move += abs(a[i] - avg); } cout << move / 2; return 0; }
这道题用数学方法解决 ,先算出平均值,再看每堆和平均值相差几,由于每次移动一堆到另一堆,这堆减一,那堆加一。所以再将相差的总和除以2便是移动的次数
-
1
讲讲这道题代码的思路,代码写的都是一样的,我就以hetao879145的代码为准
大概思路 先计算n个数的平均数,再将每个数距离平均数的距离计算出来,因为有多的就有少的,所以最后除以2就可以了。
细化问题 求平均数 先求出和,再除以n。
for(int i=1;i<=n;i++) { cin>>a[i];//输入 sum+=a[i];//算所有数的和,用来计算平均值。 }
求和并存储下n个数。
sum/=n;//肯定能整除,所以直接出就行了。
求平均数。
接着计算并累加每个数距离平均数的差
//所以我在上面说你要把n个数存到数组里。 for(int i=1;i<=n;i++) { num+=abs(a[i],sum);//abs是一个函数,这个函数的功能是用来计算绝对值的。如果没想起来的话也可以自己编函数,绝对值的函数还是很好编的。这个函数在第一年讲过。 }
现在我们的ans(所有数距离平均数的距离)已经计算好了,现在可以输出答案了。
cout<<num/2;//这个规律你自己按按计算器就能发现。abs(所有数,平均数)的和*2=移动多少草捆的数量。所以最后ans要除以2。
头文件和定义数组不要落了,建议大家头文件写 #include <bits/stdc++.h> 因为上面我们说的abs函数在 algorithm 库中。
-
0
保姆级的攻略来啦
#include<iostream> int n,a[100001],sum,k,ans;//k为所有干草堆高度的平均数 using namespace std; int main() { cin>>n;//输入n for(int i=1;i<=n;i++) { cin>>a[i]; sum+=a[i];//输入所有干草堆的高度,并计算总和 } k=sum/n;//计算k for(int i=1;i<=n;i++)//循环遍历所有干草堆的高度 { if(a[i]>k) { ans+=a[i]-k;//计算所有高度>k的干草堆共需移出多少捆干草,即题目所求 } } cout<<ans;//输出ans return 0; }
信息
- ID
- 16
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 1786
- 已通过
- 1024
- 上传者