您的位置:首页 > 其它

uvalive 3266 - Tian Ji -- The Horse Racing(贪心)

2017-11-07 20:02 429 查看
题意:田忌要和国王赛马,双方各有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: