describir
Los estudiantes C y S están jugando juntos a un juego de puntos. Hay una pila de cartas blancas y una pila de cartas azules, cada una con un número entero de puntos escritos en ella. C saca al azar n cartas blancas, S saca al azar n cartas azules y realizan n rondas de ortografía, cada uno de ellos saca una carta cada vez, el que tenga la puntuación más alta obtendrá tres chocolates y el que tenga la puntuación menor obtiene un chocolate, si los puntos son los mismos, cada persona obtendrá dos chocolates y las tarjetas usadas no se pueden reutilizar. Conociendo los puntos de la tarjeta obtenidos por C y S , programe para calcular el número máximo y mínimo de chocolates que S puede obtener.
ingresar
La entrada contiene varios conjuntos de datos de prueba.
La primera línea de cada conjunto de datos de prueba es un número entero n (1<=n<=1000) , la siguiente línea son n números enteros, que indican los puntos de la tarjeta blanca dibujada por C , y la siguiente línea también son n números enteros, indicando S Los puntos de la carta azul extraída. La entrada termina con un 0 .
producción
Para cada conjunto de datos, genera una línea, el contenido son dos números enteros separados por espacios, que representan respectivamente el número máximo y mínimo de chocolates que S puede obtener.
entrada de muestra
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
salida de muestra
9 5
4 4
4 4
analizar:
Esta pregunta es muy similar al problema de las carreras de caballos de Tian Ji , y la idea esencial es : si lo mejor de mí no es tan bueno como el tuyo , entonces lo peor de mí es mejor que lo mejor de ti , y lo mejor de mí es mejor que lo mejor que te sigue
(1) Si la tarjeta de alto valor de B puede ganar la tarjeta de alto valor de A , entonces compare , de lo contrario ejecute (2) ; (2) Si la tarjeta de poco valor de B puede ganar la tarjeta de poco valor de A tarjeta , luego compare , de lo contrario ejecute (3)) ; (3) Si el tablero de números pequeños de B puede empatar el tablero de números grandes de A , luego compare , de lo contrario realice (4) ; (4) compare los tableros de números pequeños de B tablero de números con A
Se compara la tarjeta de punto alto de la tarjeta;
Código central:
//拼点游戏(类似于田忌赛马)
#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;
}