战争

来源:互联网 发布:标签系统数据库设计 编辑:程序博客网 时间:2024/05/17 03:29

问题描述 Problem Description

高老大要打团战了。他要召集 NN 是奇数)个人去组织一场战争。现在高老大的手下有 T 个人,每个人都有一个战斗力值和影响力值。当这 N 个人的影响力值之和超过 M 的时候,必然会引起巨大的社会动荡。为了爱与和平,老大明智地决定,不引起巨大的社会动荡。同时,英明的老大发现,一个团队整体能力等于这 N 个人的战斗力的中位数,中位数越高则战斗力越强。现在老大想知道,这 N 个人的团队整体能力最大为多少。


输入描述 Input Description

输入第一行为三个正整数 NTM ,意义如上述。
后接 T 行,每行两个正整数 WiVi,代表每个人的战斗力值和影响力值。


输出描述 Output Description

输出一行一个整数,代表这 N 个人的团队最大的整体能力。无解输出 1


输入样例 Sample Input

3 5 70
30 25
50 21
20 20
5 18
35 30


输出样例 Sample Output

35


提示 Hint

选第 245 个人,影响力 21+18+30=69<70 ,同时该团队的整体能力为最高的 35


数据范围 Data Size

对于 30% 的数据,保证 T200
对于 100% 的数据,保证 T100000N20000,Vi100000M<231.


分析 I Think

先把每个人按战斗力值从小到大排序,记 fi 表示前 i 人中(不含第 i 个)选出 n12 个人时影响力之和的最小值,记 gi 表示后 i 人中(不含第 i 个)选出 n12 个人时影响力之和的最小值,这样我们就可以从后往前枚举 i , 当 fi+gi+viM 时可以的到最大的团队整体能力 wi


代码 Code

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int Size = 100007;const int inf = 0x3f3f3f3f;struct peo{int v,w;bool operator < (const peo &h)const{return v<h.v;}}a[Size];int n,m,t;int f[Size];int g[Size];priority_queue<int >que;int main(){    scanf("%d%d%d",&t,&n,&m);    for(int i=1;i<=n;++i)        scanf("%d%d",&a[i].v,&a[i].w);    sort(a+1,a+n+1);    int k = 0;    for(int i=1;i<=(t>>1);++i){        que.push(a[i].w);        f[i] = inf;        k += a[i].w;    }    f[(t>>1)+1] = k;    for(int i=(t>>1)+2;i<=n;++i)        if(que.top() > a[i-1].w){            f[i] = f[i-1]-que.top()+a[i-1].w;            que.pop();            que.push(a[i-1].w);        }        else            f[i] = f[i-1];    while(!que.empty())        que.pop();    k = 0;    for(int i=n;i>=n-(t>>1)+1;--i){        que.push(a[i].w);        g[i] = inf;        k += a[i].w;    }    g[n-(t>>1)] = k;    for(int i=n-(t>>1)-1;i>=1;--i)        if(que.top() > a[i+1].w){            g[i] = g[i+1]-que.top()+a[i+1].w;            que.pop();            que.push(a[i+1].w);        }        else            g[i] = g[i+1];    for(int i=n;i>=1;--i)        if(f[i]+g[i]+a[i].w <= m){            printf("%d",a[i].v);            return 0;        }    puts("-1");    return 0;}
0 0