problem
L2-017 人以群分 (25分) 社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的)。要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开。
输入格式: 输入第一行给出一个正整数N(2≤N≤10 5 )。随后一行给出N个正整数,分别是每个人的活跃度,其间以空格分隔。题目保证这些数字以及它们的和都不会超过2 31 。
输出格式: 按下列格式输出:
Outgoing #: N1 Introverted #: N2 Diff = N3 其中N1是外向型人的个数;N2是内向型人的个数;N3是两群人总活跃度之差的绝对值。
输入样例1: 10 23 8 10 99 46 2333 46 1 666 555 输出样例1: Outgoing #: 5 Introverted #: 5 Diff = 3611 输入样例2: 13 110 79 218 69 3721 100 29 135 2 6 13 5188 85 输出样例2: Outgoing #: 7 Introverted #: 6 Diff = 9359
给出n个人及其活跃度将其分为内向和外向两类,要求规模相近,活跃度差值大
solution
一脸懵逼莫莫名其妙乱写一通就AC了。。我也很无语要求规模对半:活跃度从小到大排序,n为偶数直接一人一半,奇数时判断中间值属于哪个收益更大当中间值与大的外向的那边更接近时,把大的外向的加上中间值,这样绝对值差会变大。
#include<bits/stdc++.h>
using namespace std
;
const int maxn
= 100010;
int a
[maxn
];
int main(){
int n
; cin
>>n
;
for(int i
= 1; i
<= n
; i
++)cin
>>a
[i
];
sort(a
+1,a
+n
+1);
int s1
= 0, s2
= 0;
if(n
%2==0){
for(int i
= 1; i
<= n
/2; i
++)
s1
+= a
[i
];
for(int i
= n
/2+1; i
<= n
; i
++)
s2
+= a
[i
];
printf("Outgoing #: %d\n",n
/2);
printf("Introverted #: %d\n",n
/2);
printf("Diff = %d\n",s2
-s1
);
}else{
int mid
= (n
-1)/2;
for(int i
= 1; i
<= mid
; i
++)
s1
+= a
[i
];
for(int i
= mid
+2; i
<= n
; i
++)
s2
+= a
[i
];
if(a
[mid
+2]-a
[mid
+1]<a
[mid
+1]-a
[mid
]){
s1
+= a
[mid
+1];
printf("Outgoing #: %d\n",mid
);
printf("Introverted #: %d\n",mid
+1);
}else {
s2
+= a
[mid
+1];
printf("Outgoing #: %d\n",mid
+1);
printf("Introverted #: %d\n",mid
);
}
printf("Diff = %d\n",s2
-s1
);
}
return 0;
}