【贪心】【multiset】 Codeforces Round #401 (Div. 2) B. Game of Credit Cards

本文介绍了一种通过排序和选择策略来最小化或最大化比赛中负场和胜场次数的方法。使用multiset进行高效处理,确保了算法的有效性和正确性。

对第一个人的排序,然后从小到大处理,对第一个人的每枚卡片,从第二个人的卡片中选择一个大于等于它的最小的,否则选择一个当前剩下的最小的,这样可以保证负场最少。

如果选择的改成大于它的最小的,就可以保证胜场最多。

用multiset处理。

#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
typedef pair<int,int> Point;
Point c[1010];
multiset<int>S,tS;
typedef multiset<int>::iterator ITER;
int n,ans;
char a[1010],b[1010],d[1010];
int main()
{
	freopen("b.in","r",stdin);
	scanf("%d%s%s",&n,a+1,b+1);
	for(int i=1;i<=n;++i)
	  {
	  	c[i].first=a[i]-'0';
	  	c[i].second=i;
	  }
	for(int i=1;i<=n;++i)
	  S.insert(b[i]-'0');
	tS=S;
	sort(c+1,c+n+1);
	for(int i=1;i<=n;++i)
	  {
	  	ITER it=S.lower_bound(c[i].first);
	  	if(it==S.end())
	  	  {
	  	  	S.erase(S.begin());
	  	  	++ans;
	  	  }
	  	else
	  	  S.erase(it);
	  }
	printf("%d\n",ans);
	ans=0;
	S=tS;
	for(int i=1;i<=n;++i)
	  {
	  	ITER it=S.upper_bound(c[i].first);
	  	if(it==S.end())
	  	  S.erase(S.begin());
	  	else
	  	  {
	  	  	S.erase(it);
	  	  	++ans;
	  	  }
	  }
	printf("%d\n",ans);
	return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/6440247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值