最小移动数算法描述:现有n堆 已堆好的砖块,但高度不一样,想移至同一高度。把所有的砖头移到同一高度,计算出移动到相同高度所需最小移动次数。
算法实现:
- #include <iostream>
- #include <fstream>
- #include <vector>
- using namespace std;
- int main(int argc,char *argv[])
- {
- //ifstream cin("aaa.txt");
- vector<int>v;
- int n,b,sum,avg,e,c=0; // c 为每组数据编号 如:Set # 1 ,Set # 2 .........
- while(cin>>n)//n:要比较的组数,以0为终止
- {
- if(n==0)break;
- c++;
- sum=0;//为求平均值,先求和
- e=0;//存储最后移动砖块的总数
- v.clear();
- for(int i=0;i<n;i++)
- {
- cin>>b;//每组各块的数目
- v.push_back(b);//push_back 到vector中
- sum=sum+b;
- }
- avg =sum/n;//取平均值
- for(int j=0;j<v.size();j++)
- {
- if(v[j]>avg)
- e=e+(v[j]-avg);
- }
- cout<<"Set #"<<c<<endl;
- cout<<"The minimum number of moves is "<<e<<endl;
- cout<<endl;
- }
- return 0;
- }
测试结果:
- 5
- 3 4 5 3 5
- Set #1
- The minimum number of moves is 2
- ***************************************************************
- 6
- 4 2 4 7 2 5
- Set #1
- The minimum number of moves is 4