题目描述
小a非常喜欢204204这个数字,因为′a′+′k′=204′a′+′k′=204。
现在他有一个长度为nn的序列,其中只含有2,0,42,0,4这三种数字
设aiai为序列中第ii个数,你需要重新排列这个数列,使得∑ni=1(ai−ai−1)2∑i=1n(ai−ai−1)2最大(公式的含义是:每个数与前一个数差的平方的和)
注意:我们默认a0=0
输入描述:
第一行一个整数n
接下来一行n个整数,第i个数表示ai
输出描述:
输出一个整数,表示∑ni=1(ai−ai−1)2的最大值
示例1
输入
2 2 4
输出
20
说明
样例1解释:按(4,2)排列是最优的,此时sum=(4−0)2+(2−4)2=20
示例2
输入
3 2 0 4
输出
36
说明
样例2解释:按(4,0,2)排列是最优的,此时sum=(4−0)2+(0−4)2+(2−0)2=36
示例3
输入
5 2 4 0 2 4
输出
52
备注:
1⩽n⩽1e5,保证ai为2/0/4中的数
思路:本来想的是4,和0一定是一块的,只要有0和4就一定是他们的差的平方;然后多出来的0或4再跟2配对,组成差的平方;
第一次的代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 5 int main() 6 { 7 int n,a[5],b; 8 while(cin >> n) 9 { 10 memset(a,0,sizeof(a)); 11 for(int i = 0;i < n;i++) 12 { 13 cin >> b; 14 if(b == 0) 15 a[0]++; 16 else if(b == 2) 17 a[2]++; 18 else 19 a[4]++; 20 } 21 ll sum = 0; 22 if(a[0] >= a[4]) 23 { 24 sum = sum + 2 * a[4] * 16; 25 //cout << "0:" << a[0] << " 4:" << a[4] << endl; 26 //cout << "-----"<< sum << endl; 27 a[0] -= a[4]; 28 a[4] = 0; 29 if(a[0] >= a[2]) 30 { 31 // cout << "0:" << a[0] << " 2:" << a[2] << endl; 32 sum = sum + 2 * a[2] * 4; 33 //cout << "-----"<< sum << endl; 34 } 35 else 36 { 37 if(a[0] == 0) 38 sum += 4; 39 else 40 sum = sum + 2 * a[0] * 4; 41 //cout << "0:" << a[0] << " 2:" << a[2] << endl; 42 //cout << "-----"<< sum << endl; 43 } 44 } 45 else if(a[4] > a[0]) 46 { 47 sum = sum + (2 * a[0] + 1) * 16; 48 //cout << "0:" << a[0] << " 4:" << a[4] << endl; 49 //cout << "-----"<< sum << endl; 50 a[4] -= a[0]; 51 a[0] = 0; 52 if(a[4] > a[2]) 53 { 54 sum = sum + 2 * a[2] * 4; 55 //cout << "2:" << a[2] << " 4:" << a[4] << endl; 56 //cout << "-----"<< sum << endl; 57 } 58 else 59 { 60 sum = sum + (2 * a[4] - 1) * 4; 61 //cout << "2:" << a[2] << " 4:" << a[4] << endl; 62 //cout << "-----"<< sum << endl; 63 } 64 } 65 cout << sum << endl; 66 } 67 return 0; 68 }
这个代码主要是分类,分了很多类;各个情况,最后我也有点晕;
然后过了样例就交了,就wa了。。。
第二次代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 5 int main() 6 { 7 int n; 8 int a[100005]; 9 while(cin >> n) 10 { 11 a[0] = 0; 12 for(int i = 1;i <= n;i++) 13 cin >> a[i]; 14 sort(a,a + n + 1); 15 ll sum = 0; 16 for(int i = n;i > (n / 2);i--) 17 { 18 sum += (a[i] - a[n - i]) * (a[i] - a[n - i]); 19 sum += (a[i] - a[n - i + 1]) * (a[i] - a[n - i + 1]); 20 } 21 cout << sum << endl; 22 } 23 return 0; 24 }
这次的思路是先把他们从小到大排序,第一个跟最后一个的差的平方一定是最大的;按照这个规律,依次把差的平方相加;
就a了。