Resumen de entrada de ACM

Tabla de contenido

1. Estructura de entrada

1. Estructura de entrada de primer nivel

2. Estructura de entrada anidada

En segundo lugar, la estructura de entrada de primer nivel.

HDU 1089 A+B para Práctica Entrada-Salida (I)

HDU 1090 A+B para Práctica Entrada-Salida (II)

HDU 1091 A+B para Prácticas Entrada-Salida (III)

HDU 1095 A+B para Práctica Entrada-Salida (VII)

3. Estructura de entrada anidada

HDU 1092 A+B para Práctica de Entrada-Salida (IV)

HDU 1093 A+B para práctica de entrada-salida (V)

HDU 1094 A+B para práctica de entrada-salida (VI)

HDU 1096 A+B para Práctica Entrada-Salida (VIII)

Cuarto, ingresa la cadena.

(1) obtiene función

CodeForces 616A Comparación de dos enteros largos

(2) Función alternativa de gets

(3) escanear

HDU 5842 Lweb y cuerda

(4) matriz de caracteres + cin

(4.1)cin

(4.2)cin.getline

(4.3) cin.obtener

(5) cuerda

(5.1)cin

(5.2) obtener línea

5. Ingrese otro contenido

1. Ingrese números enteros y reales

CSU 1000 A+B (I)

CSU 1001 A+B (II)

CSU 1002 A+B (III)

2. Utilice cadenas para ingresar números enteros y reales.

CSU 1340 Un problema de muestra

demás

3. Ingrese una combinación de números y caracteres.

4. Datos tabulares

5. Otras técnicas de entrada

(1) Ignorar la entrada


1. Estructura de entrada

1. Estructura de entrada de primer nivel

Las estructuras de entrada se dividen en 4 categorías:

  • Ingrese solo un caso de uso
  • Ingrese casos de uso hasta casos de uso especiales: HDU 1091
  • Ingrese casos de uso hasta el final del archivo: HDU 1089
  • Ingrese un número entero t primero y luego ingrese t casos de uso: HDU 1090

Cada caso de uso tiene una condición final clara.

2. Estructura de entrada anidada

Cada caso de uso puede contener varias partes. Cada parte puede incluir ingresar solo un caso de uso, ingresar casos de uso hasta casos de uso especiales, ingresar primero un número entero t y luego ingresar t casos de uso, etc. Cada caso de uso puede continuar anidado en su interior. . . .

En segundo lugar, la estructura de entrada de primer nivel.

HDU 1089 A+B para Práctica Entrada-Salida (I)

tema:

Descripción

Tu tarea es calcular a + b. 
¡¿Demasiado fácil?! ¡Por supuesto! Diseñé especialmente el problema para principiantes en acm. 
Debes haber descubierto que algunos problemas tienen los mismos títulos que este, sí, todos estos problemas fueron diseñados para el mismo objetivo. 

Aporte

La entrada constará de una serie de pares de números enteros a y b, separados por un espacio, un par de números enteros por línea. 

Producción

Para cada par de números enteros de entrada a y b, debe generar la suma de a y b en una línea, y con una línea de salida para cada línea de entrada. 

Entrada de muestra

1 5 
10 20

Salida de muestra

6 
30

Código:

<iostream>
using namespace std;

int main()
{
	int a, b;
	while (cin >> a >> b)cout << a + b << endl;
	return 0;
}

HDU 1090 A+B para Práctica Entrada-Salida (II)

tema:

Descripción

Tu tarea es calcular a + b. 

Aporte

La entrada contiene un número entero N en la primera línea y luego siguen N líneas. Cada línea consta de un par de números enteros a y b, separados por un espacio, un par de números enteros por línea. 

Producción

Para cada par de números enteros de entrada a y b, debe generar la suma de a y b en una línea, y con una línea de salida para cada línea de entrada. 

Entrada de muestra

2 
1 5 
10 20

Salida de muestra

6 
30

Código:

<iostream>
using namespace std;

int main()
{
	int n, a, b;
	cin >> n;
	while (n--)
	{
		cin >> a >> b;
		cout << a + b << endl;
	}
	return 0;
}

HDU 1091 A+B para Prácticas Entrada-Salida (III)

tema:

Descripción

Tu tarea es calcular a + b.

Aporte

La entrada contiene varios casos de prueba. Cada caso de prueba contiene un par de números enteros a y b, un par de números enteros por línea. Un caso de prueba que contiene 0 0 finaliza la entrada y este caso de prueba no se procesará. 

Producción

Para cada par de números enteros de entrada a y b, debe generar la suma de a y b en una línea, y con una línea de salida para cada línea de entrada. 

Entrada de muestra

1 5 
10 20 
0 0

Salida de muestra

6 
30

Código:

<iostream>
using namespace std;

int main()
{
	int a, b;
	while (cin >> a >> b)
	{
		if (a == 0 && b == 0)break;
		cout << a + b << endl;
	}
	return 0;
}

HDU 1095 A+B para Práctica Entrada-Salida (VII)

tema:

Descripción

Tu tarea es calcular a + b. 

Aporte

La entrada constará de una serie de pares de números enteros a y b, separados por un espacio, un par de números enteros por línea. 

Producción

Para cada par de números enteros de entrada a y b, debe generar la suma de a y b, seguida de una línea en blanco. 

Entrada de muestra

1 5 
10 20

Salida de muestra

6 

30

Código:

#include<iostream>
using namespace std;

int main()
{
	int a, b;
	while (cin >> a >> b)cout << a + b << endl << endl;
	return 0;
}

3. Estructura de entrada anidada

HDU 1092 A+B para Práctica de Entrada-Salida (IV)

tema:

Descripción

Tu tarea es calcular la suma de algunos números enteros. 

Aporte

La entrada contiene varios casos de prueba. Cada caso de prueba contiene un número entero N, y luego siguen N números enteros en la misma línea. Un caso de prueba que comienza con 0 finaliza la entrada y este caso de prueba no debe procesarse. 

Producción

Para cada grupo de números enteros de entrada, debe generar su suma en una línea y con una línea de salida para cada línea de entrada. 

Entrada de muestra

4 1 2 3 4 
5 1 2 3 4 5 
0

Salida de muestra

10 
15

Código:

#include<iostream>
using namespace std;

int main()
{
	int n, a, sum;
	while (cin >>n)
	{
		if (n == 0)break;
		sum = 0;
		while (n--)
		{
			cin >> a;
			sum += a;
		}
		cout << sum << endl;
	}
	return 0;
}

HDU 1093 A+B para práctica de entrada-salida (V)

tema:

Descripción

Tu tarea es calcular la suma de algunos números enteros. 

Aporte

La entrada contiene un número entero N en la primera línea y luego siguen N líneas. Cada línea comienza con un número entero M, y luego siguen M enteros en la misma línea. 

Producción

Para cada grupo de números enteros de entrada, debe generar su suma en una línea y con una línea de salida para cada línea de entrada. 

Entrada de muestra

2 
4 1 2 3 4 
5 1 2 3 4 5

Salida de muestra

10 
15

Código:

#include<iostream>
using namespace std;

int main()
{
	int t, n, a, sum;
	cin >> t;
	while (t--)
	{
		cin >> n;
		sum = 0;
		while (n--)
		{
			cin >> a;
			sum += a;
		}
		cout << sum << endl;
	}
	return 0;
}

HDU 1094 A+B para práctica de entrada-salida (VI)

tema:

Descripción

Tu tarea es calcular la suma de algunos números enteros. 

Aporte

La entrada contiene varios casos de prueba y un caso, una línea. Cada caso comienza con un número entero N, y luego siguen N números enteros en la misma línea. 

Producción

Para cada caso de prueba, debe generar la suma de N enteros en una línea y con una línea de salida para cada línea de entrada. 

Entrada de muestra

4 1 2 3 4 
5 1 2 3 4 5

Salida de muestra

10 
15

Código:

#include<iostream>
using namespace std;

int main()
{
	int n, a, sum;
	while (cin >> n)
	{
		sum = 0;
		while (n--)
		{
			cin >> a;
			sum += a;
		}
		cout << sum << endl;
	}
	return 0;
}

HDU 1096 A+B para Práctica Entrada-Salida (VIII)

tema:

Descripción

Tu tarea es calcular la suma de algunos números enteros. 

Aporte

La entrada contiene un número entero N en la primera línea y luego siguen N líneas. Cada línea comienza con un número entero M, y luego siguen M enteros en la misma línea. 

Producción

Para cada grupo de números enteros de entrada, debe generar su suma en una línea y debe tener en cuenta que hay una línea en blanco entre las salidas. 

Entrada de muestra

3 
4 1 2 3 
4 5 1 
2 3 4 5 3 1 2 3

Salida de muestra

10 

15 

6

Código:

#include<iostream>
using namespace std;

int main()
{
	int t, n, a, sum;
	cin >> t;
	while (t--)
	{
		cin >> n;
		sum = 0;
		while (n--)
		{
			cin >> a;
			sum += a;
		}
		cout << sum << endl;
		if (t)cout << endl;
	}
	return 0;
}

Cuarto, ingresa la cadena.

(1) obtiene función

Las cadenas de entrada del lenguaje C están representadas por matrices de caracteres.

La función gets lee la línea completa de entrada hasta que encuentra un carácter de nueva línea, luego descarta el carácter de nueva línea, almacena otros caracteres y agrega un '\0' al final.

CodeForces 616A Comparación de dos enteros largos

tema:

Descripción

Se le dan dos números enteros muy largos  a ,  b  (se permiten ceros a la izquierda). Debes comprobar qué número  a  o  b  es mayor o determinar que son iguales.

El tamaño de entrada es muy grande, por lo que no utilice la lectura de símbolos uno por uno. En lugar de eso, utilice la lectura de una línea o token completo.

Como la entrada/salida puede alcanzar un tamaño enorme, se recomienda utilizar métodos rápidos de entrada/salida: por ejemplo, prefiera usar scanf/printfin en lugar de cin/cout en C++, prefiera usar BufferedReader/PrintWriter en lugar de Scanner/System.out en Java . No use la funcióninput() en Python2 en lugar de usar la función raw_input().

Aporte

La primera línea contiene un número entero no negativo  a .

La segunda línea contiene un número entero no negativo  b .

Los números  a ,  b  pueden contener ceros a la izquierda. Cada uno de ellos contiene no más de 106 dígitos.

Producción

Imprima el símbolo "<" si  a  <  b  y el símbolo ">" si  a  >  b . Si los números son iguales, imprima el símbolo "=".

Entrada de muestra

Aporte

9 
10

Producción

<

Aporte

11 
10

Producción

>

Aporte

00012345 
12345

Producción

=

Aporte

0123 
9

Producción

>

Aporte

0123 
111

Producción

>

Simplemente compara el tamaño de dos números enteros, es muy simple.

La razón principal es que no estoy familiarizado con el lenguaje C.

Código:

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
 
 
int main()
{
	char*s1 = new char[1000000];
	char*s2 = new char[1000000];
	int l1, l2;
	char c;
	while (gets(s1) && gets(s2))
	{
		l1 = strlen(s1);
		l2 = strlen(s2);
		int i = 0, j = 0;
		while (s1[i] == '0'&& l1)
		{
			i++;
			l1--;
		}
		while (s2[j] == '0'&& l2)
		{
			j++;
			l2--;
		}
		if (l1 > l2)c='>';
		else if (l1 < l2)c='<';
		else
		{
			while (s1[i])
			{
				if (s1[i]>s2[j])
				{
					c = '>';
					break;
				}
				if (s1[i]<s2[j])
				{
					c = '<';
					break;
				}
				i++;
				j++;
				l1--;
			}
			if (l1 == 0)c = '=';
		}
		printf("%c\n", c);
	}
	return 0;
}

(2) Función alternativa de gets

Puedes usar fgets o gets_s en lugar de la función gets. Las funciones de la función son diferentes pero similares.

(3) escanear

scanf es la forma de leer palabras, ignora todos los espacios en blanco al principio y finaliza cuando lee cualquier carácter de espacio en blanco.

HDU 5842 Lweb y cuerda

tema:

Esta pregunta consiste en seleccionar una asignación de un conjunto de 26 letras a un conjunto de números enteros y luego encontrar la longitud máxima de la subsecuencia creciente más larga de la secuencia correspondiente a la matriz de caracteres en cada fila.

Si crees que estoy hablando de programación dinámica, eres estúpido.

Debido a que el mapeo puede ser opcional, el significado de esta pregunta es ingresar una cadena (solo letras minúsculas) y generar cuántas letras minúsculas diferentes tiene.

Sí, así es, ya está, se fue.

Código:

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

char c[100001];
int l[26];

int main()
{
    int t;
    scanf("%d", &t);
    for (int cas = 1; cas <= t; cas++)
    {
        scanf("%s", c);
        int len = strlen(c);
        for (int i = 0; i < 26; i++)l[i] = 0;
        for (int i = 0; i < len; i++)l[c[i] - 'a']++;
        int sum = 0;
        for (int i = 0; i < 26; i++)sum += (l[i]>0);
        printf("Case #%d: %d\n", cas, sum);
    }
    return 0;
}

(4) matriz de caracteres + cin

(4.1)cin

cin ingresa una cadena representada por una matriz de caracteres y finaliza la entrada cuando encuentra un carácter en blanco.

Como CSU 1260, CSU 1059, CSU 1019

(4.2)cin.getline

cin.getline puede leer la línea completa de la cadena, descartando el carácter de nueva línea después de cada línea leída.

Como CSU 1029

(4.3) cin.obtener

cin.get es muy similar a cin.getline, pero las nuevas líneas no se descartan sino que continúan colocándose en el búfer de entrada.

CSU 2050

(5) cuerda

(5.1)cin

La cadena de entrada cin termina con un carácter en blanco, como CSU 1041, CSU 1112, robot de control remoto CSU 1042.

(5.2) obtener línea

getline lee una línea completa, como POJ 1035

5. Ingrese otro contenido

El contenido de entrada se puede clasificar simplemente en dos tipos, números y cadenas. Si se clasifica con cuidado, hay muchos tipos.

1. Ingrese números enteros y reales

Ingresar números enteros es la situación más común y hay muchos ejemplos, como la serie HDU IO anterior.

Los problemas CSU 1000/1001/1002 A+B cubren los problemas de entrada y salida de números enteros ordinarios, enteros grandes y números reales.

CSU 1000 A+B (I)

Descripción

Tu tarea es calcular a + b.

Aporte

La entrada contiene varios casos de prueba. Cada caso de prueba consta de un par de números enteros a y b(0<=a,b<=20), separados por un espacio, un par de números enteros por línea.

Producción

Para cada par de números enteros de entrada a y b, debe generar la suma de a y b en una línea, y con una línea de salida para cada línea de entrada.

Entrada de muestra

1 1

Salida de muestra

2

Código:

#include<iostream>
using namespace std;
 
int main()
{
    inta, b;
    while(cin >> a >> b)
    {
        cout << a + b << endl;
    }
    return 0;
}

CSU 1001 A+B (II)

Descripción

Tu tarea es calcular a + b.

Aporte

Hay varios casos de prueba. Cada caso de prueba contiene solo una línea. Cada línea consta de un par de números reales a y b(0<=a,b<=1000000), separados por un espacio.

Producción

Para cada caso, genere la respuesta en una línea redondeada a 4 dígitos después del punto decimal.

Entrada de muestra

15

10 20

0,1 1,5

Salida de muestra

6.0000

30.0000

1.6000

Código:

#include<iostream>
using namespace std;
 
int main()
{
    double a, b;
    while(cin >> a >> b)
    {
        printf("%.4f",a+b);
        cout <<  endl;
    }
    return 0;
}

CSU 1002 A+B (III)

Descripción

Tu tarea es calcular a + b.

Aporte

Hay varios casos de prueba. Cada caso de prueba contiene solo una línea. Cada línea consta de un par de números enteros a y b(1=< a,b <=1016), separados por un espacio. La entrada va seguida de una sola línea con a = 0, b = 0, que no debe procesarse.

Producción

Para cada par de números enteros de entrada a y b, debe generar la suma de a y b en una línea, y con una línea de salida para cada línea de entrada.

Entrada de muestra

1 5
10 20
10000000000000000 10000000000000000
0 0

Salida de muestra

6
30
20000000000000000

Código:

#include<iostream>
using namespace std;
 
int main()
{
    long long a, b;
    while(cin >> a >> b)
    {
        if(a == 0 && b == 0)break;
        cout << a + b<<endl;
    }
    return 0;
}

2. Utilice cadenas para ingresar números enteros y reales.

CSU 1340 Un problema de muestra

tema:

Descripción

   A mi novia le encanta el 7, ¡cree que es una suerte! Si un número entero contiene uno o más 7, ¡ella también pensará que es suerte!

Aporte

    La primera línea tiene un número entero  T  (1 <=  T  <= 100), lo que significa que hay  T  casos de prueba.
    Para cada caso de prueba, solo hay una línea con un número entero  X  (1 <=  X  <= 109).

Producción

    Para cada caso de prueba, si  X  contiene uno o más 7, genere "Lucky" (sin comillas); de lo contrario, genere "Unlucky" (sin comillas).

Entrada de muestra

4
7
11
568
17171

Salida de muestra

Lucky
Unlucky
Unlucky
Lucky

PISTA

    Usamos este tema principalmente para sentir cómo debería ser un tema de competencia ACM completo.

    El "formato" de la pregunta de la competencia ACM en sí es obvio:

    la primera parte es una descripción de la pregunta, que explica los antecedentes de la pregunta, qué tareas necesita programar para completar, etc.

    La segunda parte es la convención de entrada, que le indicará si la pregunta tiene varios conjuntos de datos de prueba, el formato de cada conjunto de datos de prueba, el tipo de cada parámetro (entero, número de punto flotante, cadena, etc.) y el rango de valores, etc.

    La tercera parte es el acuerdo sobre la salida, es decir, qué contenido debe generar su programa y cuál es el formato específico.

    La cuarta parte son algunos ejemplos. Estos ejemplos solo le muestran una parte de los datos de la prueba y las respuestas correspondientes. El propósito es ayudarlo a comprender mejor el significado de la pregunta y los requisitos del formato de salida.

    Es posible que esté lleno de preguntas como yo cuando entré en contacto con ACM por primera vez. Aquí le enumeraré algunas preguntas comunes: <1>

    Si la pregunta tiene varios conjuntos de datos, ¿tenemos que combinar todos los datos como ¿El ejemplo? ¿Los resultados se calculan primero y luego se generan juntos?

    Esto no es necesario. Puede generar los resultados correspondientes a este conjunto de datos inmediatamente después de procesar un conjunto de datos.

    Pero si escribe estos ejemplos manualmente, encontrará que la entrada y la salida se mezclan en la pantalla, a diferencia de los ejemplos donde la entrada y la salida están separadas. ¿Esto no cumplirá con los requisitos? Entonces lea <2>, creo que sus preguntas serán respondidas.

    <2> ¿Cómo sabe OJ (juez en línea) si mi programa está escrito correctamente?

    OJ no analiza inteligentemente si su código es correcto o no, pero utiliza otra idea ingeniosa para juzgar si su programa cumple con los requisitos: "alimentar" algunos datos de entrada a su programa (como cuando ingresa datos en el teclado) (como presionar Ingrese después de escribir algo) y luego compare lo que su programa "produce" (igual que lo que su programa genera tal como lo ve en la pantalla) con la respuesta estándar. Si la respuesta obtenida por el programa es exactamente la misma que la respuesta estándar, entonces pasará la pregunta.

    Por lo tanto, no importa si la entrada y la salida en la pantalla se mezclan cuando ingresa manualmente el ejemplo, siempre y cuando su programa "produzca" algo exactamente igual a la respuesta estándar.

    Es precisamente debido a este mecanismo de juicio que no debe permitir que el programa imprima algunas declaraciones rápidas, como "Ingrese dos números enteros", etc., porque todo lo que genere su programa se comparará con la respuesta estándar. Responda una pregunta como esta sin una declaración que requiera salida, será muy diferente de la respuesta estándar y, naturalmente, pensará que su programa es incorrecto.

    Vale la pena mencionar que aunque dicho mecanismo de juicio no parece poder saber perfectamente si su programa es correcto (¿piense por qué?), si los datos de la prueba son lo suficientemente sólidos, "su programa es correcto" La probabilidad será muy alto.

    <3> ¿Por qué mi programa pasó todos los ejemplos, pero al final no pasó esta pregunta?

    La muestra de la pregunta es solo una pequeña parte de los datos de la prueba. El propósito es ayudarlo a comprender mejor el significado de la pregunta y los requisitos del formato de salida. Por lo tanto, aprobar la muestra no significa que todos los datos de la prueba puedan ser pasado. Solo al aprobar todos los datos del examen podrá obtener "Aceptar", lo que significa que ha aprobado la pregunta.

    <4> Después de que se generen las respuestas a cada conjunto de datos de prueba, ¿es necesario ajustarlas en líneas?

    Sí, incluso si no se indica explícitamente en la pregunta, debemos generar un "avance de línea" (es decir, "\n") después de generar las respuestas a cada conjunto de datos de prueba, tal como lo indica el ejemplo.

    A continuación, hablemos de la idea de este tema. Creo que todos deberían haber pensado en el algoritmo: simplemente juzgue si cada dígito del número entero leído es 7.

Código:

#include<iostream>
#include<cstring>
using namespace std;
 
char c[10];
 
int main()
{
    ios_base::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--)
    {
        cin >> c;
        int f = 0;
        for (int i = 0; i < strlen(c); i++)if (c[i] == '7')f = 1;
        if (f)cout << "Lucky" << endl;
        else cout << "Unlucky" << endl;
    }
    return 0;
}

La pregunta de ACM es así, es obvio que la entrada es un número entero, pero puedo pensar completamente que la entrada es cada carácter, solo necesito ver si cada carácter es 7, sin ningún cálculo matemático.

demás

CSU 1003
CSU 1053
HDU 1717 Fracciones decimales 2

3. Ingrese una combinación de números y caracteres.

CodeForces 697B Barnicle

4. Datos tabulares

SGU 454 Kakuro

5. Otras técnicas de entrada

(1) Ignorar la entrada

Parte del contenido de entrada no es necesario, por lo que puede omitir las variables.

Si ingresa tres números enteros msn, pero no es necesario s, entonces el código es:

int main()
{
	int m, n;
	cin >> m >> n >> n;
......

Si la entrada que debe ignorarse se clasifica en último lugar, incluso este tipo de cobertura no es necesaria, simplemente no la ingrese directamente. OJ no requiere que todos los datos de entrada se ingresen en el programa, OJ solo verifica la salida.

Supongo que te gusta

Origin blog.csdn.net/nameofcsdn/article/details/132224995
Recomendado
Clasificación