标签:map 分析 math.h details iostream man 思路 输出 取数据
输出需要的最少操作数。
解题思路分析
将n-1个数加1,相当于将所有数都加1,再将其中一个数减去1。
将所有数都加1这个操作,其实不会改变任何数的相对大小,也就是所有数两两之间的差都是不会变的,这对于要使所有元素均相等的目标来说没有影响,所以可以忽略这一部分。
那么问题就变成每次选个数减1来达到目标的最小次数。
要使次数最小,而且每次只能将元素减1,故应当把所有数减到与最小值相等。
若n个元素为a(0),a(1),……,a(n-1),其中最小值为min,则答案为a(0)+a(1)+……+a(n-1)-min*n。
只需求出n个数中的最小值以及它们的和来计算即可,时间复杂度为O(n)。
然后就找到最小的那个值就可以了。
附上代码:
#include <iostream> #include<math.h> #include <iomanip> #include<cstdio> #include<string> #include<map> #include<vector> #include<list> #include<algorithm> #include<stdlib.h> #include<iterator> #include<sstream> #include<string.h> #include<stdio.h> using namespace std; int main() { unsigned int n; cin>>n; int *p; //动态内存分配 p=new int[n]; for(int ii=0;ii<n;ii++) { cin>>p[ii];//读取数据 } int count=0; int min=p[0]; for(int i=0;i<n;i++) { if(p[i]<=min) { min=p[i];//在循环过程找最小值 } count=count+p[i];//在循环过程中计算总和 } //sort(p,0,n-1); //本来相用快排的 但是超时了 cout<<count-min*n;//然后就用公式法就行了 delete []p; return 0; }
标签:map 分析 math.h details iostream man 思路 输出 取数据
原文地址:http://www.cnblogs.com/William-xh/p/7144152.html