CodeForces - 777B Game of Credit Cards 田忌赛马之二

25 篇文章 0 订阅
20 篇文章 0 订阅

在第四个赛季之后,Sherlock和Moriary已经意识到他们之间的战斗的整体愚蠢,并决定继续在和平的信用卡游戏中的比赛。
这个游戏的规则很简单:每个玩家都带他最喜爱的n位信用卡。然后两位玩家一个一个地将他们的卡上写的数字命名。如果两位数字不相等,则数字较小的玩家将从另一名玩家中轻拍(通常用食指敲击前额)。例如,如果n = 3,Sherlock的卡是123,Moriarty的卡有321号,第一个Sherlock的名字1和Moriarty的名字3,所以Sherlock得到一个轻弹。然后他们都是数字2,所以没有人得到轻弹。最后,Sherlock命名3,而Moriarty命名1并获得轻拂。
当然,Sherlock会按照给予的顺序一个接一个地按诚实地命名数字,而Moriary,作为一个真正的小人,打算作弊。他将按其他顺序命名他的数字(但是,他不会改变每个数字的总数)。例如,如果Moriarty上面可以命名1,2,3,并且根本没有闪光,或者他可以命名2,3和1给Sherlock两个闪光灯。
您的目标是找出Moriarty可以获得的最低可能数量(没有人喜欢轻弹),以及Sherlock可以从Moriarty获得的最大可能数量的轻弹。注意,这两个目标是不同的,并且可以通过使用不同的策略来获得最佳结果。
输入
输入的第一行包含单个整数n(1≤n≤1000) - Sherlock和Moriarty卡将要使用的卡数。
第二行包含n位数 - Sherlock的信用卡号码。
第三行包含n位数 - Moriarty的信用卡号码。
输出
首先打印Moriarty将获得的最小可能数量的轻弹。然后打印Sherlock可以从Moriarty获得的最大可能数量的轻弹。

输入
3
123
321
输出
0
2
输入
2
88
00
输出
2
0
注意

第一个样本在问题陈述中详细阐述。在第二个样本中,没有办法Moriarty可以避免两次轻弹。

思路:写完本体之后,发现hdu拿到田忌赛马数据水了,坑人;

第一种情况:从起点贪心,遇到a[i]<b[i]时,果断让a[i]消耗b最大的值,之需保证输的少即可;

第二种情况:从末端贪心,田忌赛马的思想;(hdu那道数据水了)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define max_n 1010
using namespace std;

int a[max_n],b[max_n];
char str1[max_n],str2[max_n];

int main()
{
	int n,i,j;
	while(scanf("%d",&n)!=EOF)
	{
		getchar();
		scanf("%s",str1);
		getchar();
		scanf("%s",str2);
		for(int i=0;i<n;i++)
		{
			b[i]=str1[i]-'0';
			a[i]=str2[i]-'0';
		}
		if(n==1)
		{
			if(a[0]>b[0])
				printf("0\n1\n");
			else printf("1\n0\n");
			continue;
		} 
		sort(a,a+n);
		sort(b,b+n);
		//for(int i=0;i<n;i++)
		//	printf(" %d",b[i]);
		//printf("\n");
		//for(int i=0;i<n;i++)
		//	printf(" %d",a[i]);
		//printf("\n");
		int lose=0,win=0,t=0,tj=n-1,g=0,gw=n-1,ans=0;
		for(;t<=tj;)
		{
			if(a[t]>=b[g])
			{
				t++;
				g++;
			}
			else if(a[t]<b[g])
			{
				ans++;
				t++;
				gw--;
			}
		}
		lose=0,win=0,t=0,tj=n-1,g=0,gw=n-1;
		for(;t<=tj;)
		{
			if(a[tj]>b[gw])
			{
				win++;
				tj--;
				gw--;
			}
			else if(a[tj]<b[gw])
			{
				lose++;
				t++;
				gw--;
			}
			else if(a[tj]==b[gw]) 
			{
				if(a[t]>b[g]) 
				{
					t++;
					g++;
					win++;
				}
				else if(a[t]<b[g])
				{
					lose++;
					t++;
					gw--;
				}
				else if(a[t]==b[g])
				{
					if(a[t]==b[gw])
					{
						t++;
						gw--;
					}
					else
					{
						lose++;
						t++;
						gw--;
					}
				}
			}
		}
		printf("%d\n%d\n",ans,win);
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值