L2-017 人以群分 (25 分)
阿新 • • 發佈:2018-12-19
L2-017 人以群分 (25 分)
社交網路中我們給每個人定義了一個“活躍度”,現希望根據這個指標把人群分為兩大類,即外向型(outgoing,即活躍度高的)和內向型(introverted,即活躍度低的)。要求兩類人群的規模儘可能接近,而他們的總活躍度差距儘可能拉開。
輸入格式:
輸入第一行給出一個正整數N(2≤N≤105)。隨後一行給出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); }