拼点游戏(类似于田忌赛马)

描述

CS两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌,每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌,S随机抽取n张蓝色卡牌,他们进行n回合拼点,每次两人各出一张卡牌,点数大者获得三颗巧克力,小者获得一颗巧克力,如果点数相同,每人各得二颗巧克力,使用过的卡牌不得重复使用。已知CS取到的卡牌点数,请编程计算S最多和最少能得到多少颗巧克力。

输入

输入包含多组测试数据。
每组测试数据的第一行是一个整数n(1<=n<=1000),接下来一行是n个整数,表示C抽到的白色卡牌的点数,下一行也是n个整数,表示S抽到的蓝色卡牌的点数。
输入的最后以一个0表示结束。

输出

对每组数据,输出一行,内容是两个整数用空格格开,分别表示S最多和最少可获得的巧克力数。

样例输入

3

92 83 71

95 87 74

2

20 20

20 20

2

20 19

22 18

0

样例输出

9 5

4 4

4 4

分析:

这道题目和田忌赛马问题极为类似本质思想都是如果我最好的比不过你就拿我的最差的比你最好的再拿我最好的比你其次好的

        (1)如果B的大点数牌能赢A的大点数牌,则进行比较,否则执行(2)
        (2)如果B的小点数牌能赢A的小点数牌,则进行比较,否则执行(3)
        (3)如果B的小点数牌能平A的大点数牌,则进行比较,否则执行(4)
        (4)B的小点数牌和A的大点数牌进行比较;

核心代码:

//拼点游戏(类似于田忌赛马) 
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int c[1010];
int s[1010];
int solve(int *s,int *c,int n)
{
	int i=1;
	int j=1;
	int p=n;
	int q=n;
	int max=0;
	while(i<=p&&j<=q)
	{
		if(s[p]>c[q])//如果s的大点数能比过c的大点数,就比 
		{
			max+=3;
			p--;
			q--;
		}
		else if(s[i]>c[j])//如果s的大点数比不过c的大点数,那就用s的小点数和c的小点数比较,能比过就比 
		{
			max+=3;
			i++;
			j++;
		}
		else if(s[i]==c[q])//如果以上都比不过,那就用s的小点数和c的大点数去比,能平的话就比 
		{
			max+=2;
			i++;
			q--;
		}
		else//如果既比不过,也无法拿s的小点数去平c的大点数,那就用s的小点数去消耗掉c的大点数 
		{
			max++;
			i++;
			q--;
		} 
	}
	return max;
}
int main()
{
	int n;
	while(cin>>n&&n)
	{
		memset(c,0,sizeof(c));
		memset(s,0,sizeof(s));
		int max=0;
		int min=0;
		for(int i=1;i<=n;i++)
		cin>>c[i];
		for(int i=1;i<=n;i++)
		cin>>s[i];
		sort(s+1,s+n+1);
		sort(c+1,c+n+1); 
		max=solve(s,c,n);//找出s的最大值 
		min=4*n-solve(c,s,n);//每一局总分是4分,找出c的最大值,用总分减去c的最大值就是s的最小值 
		cout<<max<<" "<<min<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51769031/article/details/125649529