牛客寒假算法基础集训营1 B 小a与"204"

题目描述
小a非常喜欢204204这个数字,因为a+k=204′a′+′k′=204。
现在他有一个长度为nn的序列,其中只含有2,0,42,0,4这三种数字
aiai为序列中第ii个数,你需要重新排列这个数列,使得ni=1(aiai1)2∑i=1n(ai−ai−1)2最大(公式的含义是:每个数与前一个数差的平方的和)
注意:我们默认a0=0

输入描述:

第一行一个整数n
接下来一行n个整数,第i个数表示ai

输出描述:

输出一个整数,表示ni=1(aiai1)2的最大值
示例1

输入

2
2 4

输出

20

说明

样例1解释:按(4,2)排列是最优的,此时sum=(40)2+(24)2=20
示例2

输入

3
2 0 4

输出

36

说明

样例2解释:按(4,0,2)排列是最优的,此时sum=(40)2+(04)2+(20)2=36
示例3

输入

5 
2 4 0 2 4

输出

52

备注:

1n1e5,保证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了。

 

猜你喜欢

转载自www.cnblogs.com/lu1nacy/p/10310769.html