1. 程式人生 > >L2-017 人以群分 (25 分)

L2-017 人以群分 (25 分)

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
	#include<bits/stdc++.h>
	using namespace std;
	int main(){
	  multiset<int> op;//輸入的活躍度可能相同,所以要使用multiset容器,而不能用set容器
	  int n;
	  cin>>n;
	  int m=n;
	  int ma=0,mi=0;
	  int d;
	  for(int i=0;i!=n;++i){
	    scanf("%d",&d);
	    op.insert(d);
	  }
	  int j;
	  j=0;
	  n%2==0?n=n:n=n+1;//判斷n是否為偶數,如果n為偶數代表兩種型別的人數是一樣的,如果n是
                        //奇數,則外向型的人數比內向型的人數多一
	  for(auto i=op.begin();j<m/2;++i,++j){
	    ma+=*i;//前一半的人數,op為set容器,自動升序排列
	  }
	  j=0;
	  for(auto i=op.rbegin();j<n/2;++j,++i){
	    mi+=*i;
	  }
		printf("Outgoing #: %d\n",n/2);
		printf("Introverted #: %d\n",m/2);
		printf("Diff = %d",mi-ma);
	}