【JZOJ 100029】【NOIP2017提高A組模擬7.8】陪審團 (貪心+排序)

問題描述
陪審團制度歷來是司法研究中的一個熱議話題,由於陪審團的成員組成會對案件最終的結果產生巨大的影響,訴訟雙方往往圍繞陪審團由哪些人組成這一議題激烈爭奪。 小 W 提出了一個甲乙雙方互相制衡的陪審團成員挑選方法:假設共有 n 名候選陪審團成員,則由甲先提名 s 位候選人,再由乙在甲提名的 s 位候選人中選出 t 名,作爲最終的陪審團成員。顯然這裏應當有n ≥ s ≥ t。假設候選人 k 對甲、乙的有利程度都可以用一個二元組(����, ����)來表示,����越大說明候選人 k 對甲越有利,����越大則對乙越有利。在此前提下,雙方的目標都變得明確:甲要最大化最終陪審團 t 人的 x 之和,最小化 y之和,乙則反之。 現在甲方決定聘請你爲律師,並且事先得知了乙方律師的策略:乙方律師會在你提名的 s 名候選人中選出 t 名使得這 t 人的 y 值之和最大,再保證 y 值之和最大的前提下使得 x 值之和儘量小(在對乙方最有利的前提下對甲方最不利)。 現在你應當慎重地提名 s 位候選人使得最終由乙方律師確定的 t 人 x 值和最大,若有多種方案,則應再使被乙方排除掉的 s-t人的 y 值和儘量大,在此基礎上最大化 s 人的 x 值 之和,在此基礎上最小化 s 人的 y 值 之和。 你的當事人並不關心你提名的具體是哪些人,只要你告訴他你提名的 s 人的 x 值之和 與 y 值之和。
輸入
第一行包含三個整數 n,s,t。 接下來 n 行,每行兩個整數分別表示xk, yk。
輸出
共一行兩個整數,分別爲 x 值之和與 y 值之和。
樣例輸入
3 2 1
2 1
3 4
5 2
樣例輸出
7 3
數據範圍
對於 30%的測試數據n ≤ 20
對於 50%的測試數據n ≤ 100
對於 100%的測試數據n ≤ 100000, x, y ≤ 1000000
算法討論
顯然我們要先選出對自己最有利的t個人,然後我們要做到讓乙方律師只能選對我們最有利的t個,那麼我們剩下的s-t個人的y就要小於t個人中最小的y,排多幾次序後選人就好。

#include <cstdio>
#include <algorithm>
#define MAX_N 1000006
using namespace std;
struct arr
{
    int x,y,m;
}a[MAX_N];
int n,s,t,Min=0x7f7f7f7f;
long long x,y;

bool cmp(arr a,arr b)
{
    if (a.x==b.x)
        return a.y>b.y;
    return a.x>b.x;
}

bool cmp1(arr a,arr b)
{
    if (a.y==b.y)
        return a.x<b.x;
    return a.y<b.y;
}

int main()
{
    scanf("%d%d%d",&n,&s,&t);
    for (int i=1;i<=n;i++)
        scanf("%d%d",&a[i].x,&a[i].y);
    sort(a+1,a+n+1,cmp1);
    for (int i=1;i<=n;i++)
        a[i].m=i;
    sort(a+s-t+1,a+n+1,cmp);
    for (int i=s-t+1;i<=s;i++)
    {
        x+=a[i].x;
        y+=a[i].y;
        if (a[i].m<Min)
            Min=a[i].m;
    }
    sort(a+1,a+n+1,cmp1);
    for (int i=Min-1;i>=Min-s+t;i--)
    {
        x+=a[i].x;
        y+=a[i].y;
    }
    printf("%lld %lld",x,y);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章