题意:给m个数字, 这些数字都不大于 n, sum的值为相邻两个数字 差的绝对值。求这n个数字里把一个数字 用 其中另一个数字代替以后,
最小的sum值。
分析:刚开始以为两个for 最坏情况下 会超时,但是实际不会,因为如果第一个for循环多的话,第二个for循环肯定少。
替换的时候,用这个数相关联的排序后 中间的一个数替换,是最小的。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <algorithm> 7 using namespace std; 8 #define Min(a,b)((a)>(b)?(b):(a)) 9 const int maxn = 100000 + 10; 10 int a[maxn]; 11 vector<int>v[maxn]; 12 13 int main() 14 { 15 int n, m, i, j, _size, tmp; 16 __int64 sum, sum2, sum3; 17 scanf("%d%d", &n, &m); 18 sum = 0; 19 for(i = 0; i < m; i++) 20 { 21 scanf("%d", &a[i]); 22 if(i != 0 && a[i] != a[i-1]) 23 { 24 v[a[i]].push_back(a[i-1]); 25 v[a[i-1]].push_back(a[i]); 26 sum += abs(a[i] - a[i-1]); 27 } 28 } 29 vector<int>x; 30 sum3 = sum; 31 for(i = 1; i <= n; i++) 32 { 33 _size = v[i].size(); 34 if(_size == 0) 35 continue; 36 x = v[i]; 37 sort(x.begin(), x.end()); 38 tmp = x[_size/2]; 39 40 sum2 = sum3; 41 for(j = 0; j < _size; j++) 42 sum2 += (abs(tmp-x[j]) - abs(i-x[j])); 43 sum = Min(sum, sum2); 44 } 45 printf("%I64d ", sum); 46 return 0; 47 }