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