链接:https://ac.nowcoder.com/acm/contest/9667/G
题目
牛牛喜欢玩滑板,牛妹也喜欢玩滑板。
牛牛会n个动作,每个动作的华丽值为 a[i],牛妹会m个动作,每个动作的华丽值为b[i],m ≤ n.
现在他们进行 m 次比赛,每一次比赛两人选择一个动作,且每个动作只能用一次,华丽值大的获胜。
牛牛已经悄悄的打探过,所以知道牛妹参加m次比赛所用动作的顺序。
牛牛想知道怎么安排动作的顺序,使得他可以尽可能多的赢得比赛次数。
思路
贪心问题,有点类似于田忌赛马。每次我们只需要拿出得分比牛妹高一点的动作就ok了。
将b[i]在a数组里二分查找第一个大于b[i]的。如果没有就拿个最烂的跟她一换一。
这样就需要不断的更新和删除元素,数组就很麻烦,所以这里用的是multiset。
伊丽莎白!
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int b[maxn];
int main()
{
multiset<int>s;
int n,m,x;
int ans=0;
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>x;
s.insert(x);
}
for(int i=0;i<m;i++)
cin>>b[i];
multiset<int>::iterator pos;
for(int i=0;i<m;i++)
{
pos=s.upper_bound(b[i]);
if(pos==s.end())
{
s.erase(s.begin());
continue;
}
ans++;
s.erase(pos);
}
cout<<ans<<endl;
}
单身狗不应该是去努力舔而不是半夜看综艺疯狂狗叫吗?