uvalive 3266

来源:互联网 发布:卫视直播软件哪个好 编辑:程序博客网 时间:2024/06/03 20:19

题意:田忌要和国王赛马,双方各有n只马,赢一场得200,输一场,失200,平局不给钱;问怎么安排田忌赚最多;

思路:排序后,将国王的马从大到小找到a中匹配的马,用set和二分搞定这个步骤,然后得到最多的胜场数,然后将未匹配的a和b中的马倒序匹配。就是答案了。

#include <bits/stdc++.h>using namespace std;const int maxn = 1000 + 5;int a[maxn], b[maxn], visa[maxn], visb[maxn];multiset<pair<int,int>>s;int main(){    int n;    while(~scanf("%d", &n))    {        if(n == 0)  break;        s.clear();        for(int i = 0; i < n; i++)  scanf("%d", &a[i]), visa[i] = 0;        for(int i = 0; i < n; i++)  scanf("%d", &b[i]), visb[i] = 0;        sort(a, a + n);        sort(b, b + n);        for(int i = 0; i < n; i++)  s.insert({a[i], i});        int win = 0;        for(int i = n - 1; i >= 0; i--)        {            multiset<pair<int, int>>::iterator it = s.lower_bound({b[i] + 1, 0});            if(it != s.end())            {                visa[it->second] = visb[i] = 1;                s.erase(it);                win++;            }        }        int p = n - 1, lose = 0;        for(int i = 0; i < n; i++)        {            if(visa[i] == 1)    continue;            while(p >= 0 && visb[p] == 1)  p--;            if(p < 0)   break;            if(a[i] < b[p]) lose++;            p--;        }        printf("%d\n", 200 * (win - lose));    }    return 0;}
原创粉丝点击