给定一个数组a,保证长度为偶数,每次可以任意选择两个数字,并取最小的那个,剩下的接着做如此的操作,最后将所有的最小的数字加起来,求这个和最大是多少。
可以发现,对于一个二元组来说答案只跟较小的那个元素有关,那么对于最大的那个元素取次大的可以使得次大的元素的值对答案产生贡献,如果选其它的元素的话,次大值也不会被加入贡献。
以此类推,可以得知将数组排序后相邻两项必定是组成一对的。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 #include <vector> 7 #include <queue> 8 #include <cmath> 9 10 using namespace std; 11 12 int n, a[305], ans; 13 14 int main(){ 15 scanf("%d", &n); 16 n *= 2; 17 for(int i = 1 ; i <= n ; i++)scanf("%d", &a[i]); 18 sort(a + 1, a + 1 + n); 19 for(int i = 1 ; i <= n ; i += 2)ans += a[i]; 20 printf("%d\n", ans); 21 }