2023 El sexto concurso de programación de pregrado de Guangxi (competencia de calentamiento) resolución de problemas


Enlace de competencia, puede continuar enviando el código

El sexto concurso de programación de pregrado de Guangxi en 2023 (competencia de calentamiento)

Las preguntas son todas de las preguntas originales de la competencia provincial del año pasado.

Referencias

Zhihu: Algunas soluciones para la quinta competencia de programación para estudiantes universitarios GXCPC Guangxi (sin CDK)

La pregunta A enviará subpreguntas, omitir


Operación de bit B Función de bit bajo

La idea principal del tema:

Realice una operación en un número (binario) y solicite los pasos de operación más cortos para convertirlo en 0.
Modo de operación: x+=bit bajo (x) o x−= bit bajo (x)

Ideas para resolver problemas:

Después de la observación,
un solo "1" se puede convertir en "0" solo después de una operación, es decir, el
"1" continuo de x−=lowbit(x) se puede convertir en "0" solo después de dos operaciones, como
1111 -> x+=bit bajo(x) -> 10000 -> x−=bit bajo(x) -> 0

Para manejarlo mejor (para evitar la necesidad de agregar 0 al llevar al primer dígito), puede invertirlo primero y agregar dos caracteres "00" al final.

Luego escanea la cadena de izquierda a derecha. Si un carácter se explora como '1', se comprueba el carácter a la derecha.
Si el carácter de la derecha es '0', significa que este es un "1" independiente, y la cuenta se incrementa en uno;
si el carácter de la derecha también es '1', significa que este es un "continuo" 11", y el primer Cada '1' se cambia a '0', y el '1' anterior se cambia a '0', hasta que se encuentra un '0', y el último '0' se cambia a '1' . Luego retroceda un espacio y continúe escaneando.

código de referencia c++

#include <iostream>
#include <algorithm>
using namespace std;

signed main() {
//	加快输入输出速度,常用方法
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	string s;
	cin >> s;
	reverse(s.begin(), s.end());
	s += "00";
	int cnt = 0, n = s.size();
	for (int i = 0; i < n; i++) {
		if (s[i] == '1') {
			if (i == n - 1 || s[i + 1] == '0')
				cnt++;
			else {
				while (i < n - 1 && s[i] == '1')
					s[i++] = '0';
				s[i] = '1';
				i--;
				cnt++;
			}
		}
	}
	cout << cnt << endl;
	return 0;
}

c tarea

La idea principal del tema:

Hay muchas asignaciones por escribir, cada una con un número diferente de palabras (tiempo requerido). Pero puede escribir una copia primero y luego copiarla para otros Por supuesto, se necesita un tiempo diferente para copiar diferentes tareas.

Ideas para resolver problemas:

En primer lugar, debemos escribir al menos la mayor cantidad de palabras, y podemos usar copiar y pegar para resolver el resto.

Pero eso no significa que terminemos la mayor parte de la tarea primero. Por ejemplo, los tres números de tarea son 100, 200 y 300, y el tiempo de copia correspondiente es 99, 199 y 1. Entonces, obviamente, primero escribimos 200 palabras, luego las copiamos en la tarea 1 y 3, y finalmente compensamos las palabras que faltan en la tarea 3 para ahorrar tiempo.

Como se ha fijado la cantidad de palabras que queremos escribir, podemos saber el tiempo preliminar, y entonces solo no se puede pegar la primera copia, por lo que elegimos la que más tiempo lleva copiar para la primera tarea.

Es decir, el tiempo total es: el número máximo de palabras + la suma de otros tiempos de copia después de eliminar el tiempo máximo de copia.

código de referencia c++

#include <iostream>
#include <vector>
using namespace std;
#define endl '\n'
#define int ll
typedef long long ll;

signed main() {
//	加快输入输出速度,常用方法
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int n, cnt = 0, ans = 0;
	cin >> n;
	vector<int>a(n), b(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
		cnt = max(cnt, a[i]);
	}
	for (int i = 0; i < n; i++) {
		cin >> b[i];
		cnt += b[i];
		ans = max(ans, b[i]);
	}
	cout << cnt - ans;
	return 0;
}

D sin celos

La idea principal del tema:

Hay dos personas, y el valor de la misma mercancía es diferente a sus ojos. Es necesario comparar el valor de las cosas propias con el valor de las cosas de la otra parte entre los primeros i artículos.

Ideas para resolver problemas:

La pregunta es muy larga, pero es una pregunta de inicio de sesión (como dijo el grandullón de Internet).

Registre el valor máximo de sus propios artículos en ambos lados a sus propios ojos y el valor máximo a los ojos de la parte contraria, y los dos artículos que la parte contraria piensa que mi valor es el más grande y el más pequeño.

  • Siempre que ambas partes piensen que sus cosas son del valor más alto, se emitirá EF.
  • Si el valor del elemento opuesto menos el elemento más pequeño es menor que el mío, genera EFX.
  • Si el valor del elemento opuesto menos el elemento más grande es más pequeño que el mío, genera EF! .
  • En otros casos, la salida E.

Es mucho más conveniente utilizar el procesamiento de pares.

Preste atención a la optimización, de lo contrario, es posible que no pueda pasar.

código de referencia c++

Use C++ (g++ 7.5.0) para enviar el código, C++ (clang++ 11.0.1) puede tener problemas

#include <iostream>
using namespace std;
// 这行要写,不然可能过不去
#define endl '\n'
#define int ll
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>PII;

signed main() {
//	加快输入输出速度,常用方法
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	//max表示对面认为我的价值最高的物品,min表示对面认为我的价值最低的物品
	int n, a, b, c, maxx = 0, maxy = 0, minx = 1e9, miny = 1e9;
	//first表示自己拥有的自己眼里物品总价值,second表示自己拥有的对面眼里物品总价值
	PII x, y;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a >> b >> c;
		if (c == 0) { // 物品属于第一个人
			x.first += a;
			x.second += b;
			maxx = max(maxx, b);
			minx = min(minx, b);
		} else { // 物品属于第二个人
			y.first += b;
			y.second += a;
			maxy = max(maxy, a);
			miny = min(miny, a);
		}
//		对应四种情况
		if (x.first >= y.second && y.first >= x.second) {
			cout << "EF" << endl;
		} else if (x.first >= y.second - miny && y.first >= x.second - minx) {
			cout << "EFX" << endl;
		} else if (x.first >= y.second - maxy && y.first >= x.second - maxx) {
			cout << "EF1" << endl;
		} else
			cout << "E" << endl;
	}
	return 0;
}

La siguiente es la traducción de la pregunta D:

no celoso

Tema Descripción

Esta pregunta es un problema fundamental en economía e informática: cómo distribuir los bienes de manera justa a los agentes competidores.

El problema supone que hay un conjunto M que contiene m elementos y el objetivo es distribuir estos elementos entre n agentes de manera justa.

Uno de los conceptos de "justicia" es no estar celoso. Específicamente, si el valor de la combinación de artículos del agente i Xj propiedad del agente j es mayor que el valor de su propia combinación de artículos Xi, entonces se dice que el agente i está celoso del agente j.

Entre ellos, cada agente está interesado en cada elemento j, y tiene un valor wi para él, y también está interesado en un conjunto de elementos S, y expresa la suma de los valores de todos los elementos en él como Wi(S) .

La asignación es el proceso de dividir M en subconjuntos separados X1, ..., Xn, donde Xi es el conjunto de elementos asignados al agente i.

Esta pregunta involucra tres métodos de asignación: EF (envidia de cero), EFX (envidia de cualquier artículo), EF1 (envidia de un artículo). En el primer método de asignación más preferido y mejor EF, ningún agente puede estar celoso de otro agente; en el segundo método de asignación EFX, el agente i puede estar celoso del agente j, pero siempre que esta envidia desaparezca cuando se elimine cualquier elemento del conjunto de elementos propiedad de la persona j; en la tercera asignación EF1, el agente i también puede estar celoso del agente j, pero siempre que elimine cualquier elemento del conjunto y la envidia desaparezca.

En este problema, considere solo el caso de dos agentes, Colin y Eva. Para empezar, ninguno de ellos tiene ningún artículo. Luego realice m operaciones, y cada operación proporciona tres valores ci, ei y bi, que representan el valor del artículo desde las perspectivas de Colin y Eva, y si el artículo está asignado a Colin o Eva. Después de cada operación, es necesario juzgar la prioridad del método de asignación actual. El más alto es EF, seguido de EFX, y luego EF1, si no se satisface, lo peor es la envidia.

ingrese la descripción

La primera línea contiene un número entero m (1 <= m <= 10^6).

En las siguientes m líneas, cada línea contiene tres números enteros ci, ei (1 <= ci,ei <= 10^6) y bi (bi∈{0,1}), que representan el valor Like de Colin y Eva y si asignar el artículo a Colin o Eva.

descripción de salida

Después de cada operación, genera una línea:

  • Si el método de asignación actual es "EF", genere "EF";

  • De lo contrario, si el método de asignación actual es "EFX", genere "EFX";

  • De lo contrario, si el método de asignación actual es "EF1", genere "EF1";

  • De lo contrario, salida "E".

Ejemplo 1

ingresar

5
5 2 0
5 2 1
2 2 0
9 2 1
9 2 1

producción

EFX
EF
EFX
EF1
E

Supongo que te gusta

Origin blog.csdn.net/weixin_45940369/article/details/131024684
Recomendado
Clasificación