Codeforces Ronda # 721 (Div. 2)

Codeforces Ronda # 721 (Div. 2)

A. Y luego hubo K

inserte la descripción de la imagen aquí

Ejemplo

aporte

3
2
5
17

producción

1
3
15

La idea principal del tema:

Dado un entero positivo n, encuentre el mayor k tal que n & (n−1) & (n−2) & (n−3) & … (k) = 0

Ideas:

Asumiendo que n es 17 y el binario es 10001, simulemos el proceso de solución.

17 10001

16 10000

15 01111

Porque la característica de AND bit a bit es que mientras haya un 0 en un bit, el último bit será 0.

Mirémoslo verticalmente, del 17 al 15, 0 apareció una vez en cada dígito, por lo que 15 es la respuesta. Luego dé más ejemplos para observar las características y descubra que la respuesta es establecer el 1 más a la izquierda del binario de n en 0, y establecer todo el resto en 1.

como:

La respuesta a 10001 11101 10111 es 01111

código:

#include<algorithm>
#include<iostream>
#define endl '\n'
#define int long long
using namespace std;
int qpow(int a,int b){
    
    int ans=1;while(b){
    
    if(b&1)ans=ans*a;b>>=1;a=a*a;}return ans;}

signed main()
{
    
    
	int n;
	cin>>n;
	while(n--)
	{
    
    
		int a;
		cin>>a;
		int ans=0;
		while(a)//有多少位
		{
    
    
			a>>=1;
			++ans;
		}
		--ans;
		cout<<qpow(2,ans)-1<<endl;
	}
	return 0;
}

Cuando se encuentra con este tipo de problema de operación de bits, generalmente se expresa la representación binaria del número, y luego de acuerdo con las características de la operación (por ejemplo, la característica de & es que mientras haya un 0, el último es 0 ), encontrar la ley.

B1. Palindrome Game (versión fácil)

inserte la descripción de la imagen aquí

Ejemplo

aporte

2
4
1001
1
0

producción

BOB
BOB

inserte la descripción de la imagen aquí

La idea principal del tema:

Da una cadena (la cadena en esta pregunta debe ser un palíndromo al principio).

1. Un 0 se puede cambiar a 1, y el número del operador es +1.

2. O voltear toda la cuerda (siempre que la cuerda no sea un palíndromo y no se volteé la operación de la persona anterior).

Alice primero, cuando la última cadena es todo 1, el que tiene el número mayor pierde, y si el número es el mismo, será un empate.

Idea:
Debido a que es un palíndromo al principio, Alicia tiene que realizar la operación 1. Si todavía puede ser un palíndromo después de esta operación, entonces Alicia ganará.

Por ejemplo: 10001

Después de que Alice realice 1, 10101

Bob no puede voltear, por lo que tiene que realizar 1 operación, 11101

En este momento, Alice es muy inteligente y no hará tontamente que su número sea más grande, por lo que elige 2 para voltear la cadena, 10111

Bob tuvo que continuar con 1 operación, 111111

En este momento, Bob ya tiene un número de 2 y Alice es 1, por lo que Alice gana.

Por ejemplo: 10101

Alice 1 no es un palíndromo después de la operación, lo que le permite a Bob aprovecharlo, y finalmente Bob gana

La clave es que sigue siendo un palíndromo después de la primera operación de Alice, y depende de si el carácter en el medio de la cadena cambiada es 0, solo el carácter en el medio es 0 y la longitud de la cadena es un número impar. (no hay medio en el caso de un número par) Alice gana cuando , de lo contrario, Bob gana.

También hay un caso especial, es decir, cuando solo hay un 0, porque es un palíndromo al principio, Alicia tiene que operar con 1, por lo que Alicia debe ser +1, y Bob es 0, por lo que Bob gana.

código:

#include<algorithm>
#include<iostream>
#include<string>
#define endl '\n'
#define int long long
using namespace std;

signed main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		int n;
		cin>>n;
		string a;
		cin>>a;
		int numzero=0;
		for(int i=0;i<a.size();++i)
		{
    
    
			if(a[i]=='0')
			{
    
    
				++numzero;
			}
		}
		if(numzero==1)cout<<"BOB"<<endl;//只有一个0
		else if((n&1)&&a[n/2]=='0')//是奇数个,中间为0
		{
    
    
			cout<<"ALICE"<<endl;
		}
		else
		{
    
    
			cout<<"BOB"<<endl;
		}
	}
	return 0;
}

Para las preguntas del juego, simule el significado de las preguntas usted mismo e intente encontrar algunas reglas. No hay empate en esta pregunta, por lo que tenía miedo de enviarla en ese momento. .

B2. Palindrome Game (versión dura)

Igual que B1

Ejemplo

aporte

3
3
110
2
00
4
1010

producción

ALICE
BOB
ALICE

inserte la descripción de la imagen aquí

La idea principal del tema:

La diferencia entre esta pregunta y B1 es que la cadena al principio puede no ser un palíndromo.

Ideas:

Cuando sea un palíndromo al principio, utilice la conclusión de B1.

Cuando no es un palíndromo al principio, Alice puede voltearlo al principio, dejando a Bob sin aliento, por lo que Bob no puede ganar.

Pero hay una situación de empate, 001, solo 2 0, y el medio es 0.

código:

#include<algorithm>
#include<iostream>
#include<string>
#define endl '\n'
#define int long long
using namespace std;

signed main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		int n;
		cin>>n;
		string a;
		cin>>a;
		string b=a;
		reverse(b.begin(),b.end());
		int numzero=0;
		for(int i=0;i<a.size();++i)
		{
    
    
			if(a[i]=='0')
			{
    
    
				++numzero;
			}
		}
		if(b==a)//用1的结论
		{
    
    
			if(numzero==1||!(n&1))cout<<"BOB"<<endl;
			else if((n&1)&&a[n/2]=='0')
			{
    
    
				cout<<"ALICE"<<endl;
			}
			else
			{
    
    
				cout<<"BOB"<<endl;
			}
		}
		else
		{
    
    
			if(numzero==2&&(n&1)&&a[n/2]=='0')cout<<"DRAW"<<endl;//只有这一种情况平局
			else cout<<"ALICE"<<endl;
		}
	}
	return 0;
}

C. Peso del par de secuencias

inserte la descripción de la imagen aquí

Ejemplo

aporte

2
4
1 2 1 1
4
1 2 3 4

producción

6
0

La idea principal del tema:

Dada una matriz, encuentre la suma del número de pares de números idénticos para cada subsecuencia.

analizar:

Violencia O (n * n), definitivamente no, por lo que debe haber algún método O (n) que se pueda lograr.

En primer lugar, la respuesta debe estar relacionada con la cantidad de veces que aparecen estos números y, en segundo lugar, también está relacionada con la posición de los números.

código:

#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#define endl '\n'
#define int long long
using namespace std;

map<int,int>ma;

signed main()
{
    
    
	fastio();
	int t;
	cin>>t;
	while(t--)
	{
    
    
		int n;
		cin>>n;
		int ans=0;
		for(int i=1;i<=n;++i)
		{
    
    
			int a;
			cin>>a;
			ans+=ma[a]*(n-i+1);
			ma[a]+=i;
		}
		cout<<ans<<endl;
		ma.clear();
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Story_1419/article/details/117116355
Recomendado
Clasificación