人は集団でcc++(ソーシャルネットワークでは一人一人に「活躍度」を定義しています)

1925 ワード

タイトルの要件:
ソーシャルネットワークでは、一人一人に「活発度」を定義し、この指標に基づいて、外向型(outgoing、すなわち活発度が高い)と内向型(introverted、すなわち活発度が低い)の2つに分類したいと考えています.2つのグループの規模ができるだけ接近し、彼らの総活発度の差ができるだけ開くことを要求している.
入力形式:
最初の行を入力すると、正の整数N(2≦N≦10 5)が与えられる.その後の行には、それぞれの人の活躍度であり、その間をスペースで区切ったN個の正の整数が与えられる.テーマはこれらの数字とそれらの和が231を超えないことを保証します.
出力フォーマット:次の形式で出力します.
Outgoing #: N1 Introverted #: N2 Diff = N3
このうちN 1は外向型の人の数である.N 2は内向型人間の個数である.N 3は両グループの総活躍度の差の絶対値である.
サンプル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
この問題の最も肝心な一言は、2つのグループの規模ができるだけ接近し、彼らの総活発度の差ができるだけ開くことを要求している.人間の活躍度を小さい頃から大きく並べて、真ん中から切り離すことです.Nは偶数で、言いやすいです;Nは奇数でも難しくない.考えが正しい限り.道が長いのを恐れない.コードは次のとおりです.
#include
#include
#include//memset()      
using namespace std;
typedef long long LL;
LL acv[100100],sum[100100];
int main()
{
    memset(acv,0,sizeof(acv));
    memset(sum,0,sizeof(sum));
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&acv[i]);
    }
    sort(acv+1,acv+1+n);
    sum[0]=0;
    for(int i=1;i<=n;i++){
        sum[i] = sum[i-1]+acv[i];//      
    }
    int a1 = n/2;//    
    int b1 = n-n/2;//    
    LL diff1 = sum[n] - 2*sum[a1];//      
    LL diff2 = sum[n] - 2*sum[b1];//      
    if(diff1>diff2){//       
        printf("Outgoing #: %d
",b1); printf("Introverted #: %d
",a1); printf("Diff = %lld
",diff1); } else { printf("Outgoing #: %d
",a1); printf("Introverted #: %d
",a1); printf("Diff = %lld
",diff2); } }

こんなに簡単です......これはあなたの考えが正しいです.
強さと自信を一身に集めたシイタケの涼しさ.