Asignación de la semana 3

Pregunta de selección pregunta A

Descripción del título

Dados los números positivos [Error de procesamiento matemático], ZJM puede seleccionar exactamente [Error de procesamiento matemático] de ellos que sume a [Error de procesamiento matemático]. ¡Ahora ZJM se pregunta cuántas formas de obtenerlo!
entrada:
La primera línea, un número entero [Error de procesamiento matemático], indica el número de casos de prueba. Para cada caso, hay dos líneas. La primera línea, tres enteros indican [Error de procesamiento matemático], [Error de procesamiento matemático] y [Error de procesamiento matemático]. Los números enteros de la segunda línea, [Error de procesamiento matemático] indican los números positivos.
salida:
para cada caso, un número entero indica la respuesta en una línea independiente.

Ideas

Aquí, todos los números se almacenan en una matriz. Esta matriz realiza la operación recursiva dfs. Cuando la recursión es k veces, se juzga si es correcta. Antes de k veces, es mayor que S y la recursión debe terminar antes para ahorrar tiempo

Código
#include<iostream>
using namespace std;
int n,K,S,ans;
int a[100];


void dfs(int k,int sum,int end)
{
	if(sum>S)return;//提前退出 
	if(k==K)
	{
		if(sum==S) ans++;
	}
	else 
	{
		for(int i=end;i<n;i++)
			dfs(k+1,sum+a[i],i+1);
	}
}

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n>>K>>S;
		for(int i=0;i<n;i++)
			cin>>a[i];
		ans=0;
		dfs(0,0,0);
		cout<<ans<<endl;
		
	}
	return 0;
}

Resumen

Soy culpable de esta tarea por ser juguetón y no prestar atención a los avisos en el grupo. No encontré algo mal hasta el final de esta tarea, o (╥﹏╥) o.

Elegir un punto en la pregunta B

Descripción del título

Hay n intervalos cerrados [a_i, b_i] en la recta numérica. Tome la menor cantidad de puntos posible para que haya al menos un punto en cada intervalo (los puntos contenidos en diferentes intervalos pueden ser los mismos)
Entrada:
1 entero N en la primera línea (N <= 100)
líneas 2 ~ N + 1 , Dos enteros a, b (a, b <= 100)
salida por línea :
un entero que representa el número de puntos seleccionados

Ideas

El significado de esta pregunta es muy claro. Aquí uso este criterio codicioso, tomo el nodo derecho más pequeño en el intervalo restante y comparo su nodo izquierdo con el punto de referencia que es el nodo derecho del intervalo seleccionado previamente. ¿Cómo puede ser más pequeño que el nodo derecho? Se puede compartir un punto, de lo contrario el punto de referencia se actualiza al nodo derecho del nuevo intervalo. Aquí, todos los intervalos se ordenan de forma no decreciente con el nodo correcto, y los elementos se toman secuencialmente de ellos.

Código
#include<iostream>
#include<algorithm>
using namespace std;

struct mm
{
	int l,r;
	mm(){};
	mm(int a,int b):l(a),r(b){};
	bool operator<(const mm&p)
	{
		return r<p.r;
	}
};
mm shu[101];
int n;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>shu[i].l>>shu[i].r;
	}
	sort(shu,shu+n);
	int count=0,nowp=-1;
	for(int i=0;i<n;i++)
		if(shu[i].l>nowp)
		{
			nowp=shu[i].r;
			count++;
		}
	cout<<count<<endl;
	return 0;
}
Resumen

A través de esta pregunta, Konjac puede descubrir el truco de sobrecargar el signo menor y el signo menor en la función cmp. Como se muestra en la siguiente función cmp, a y b pueden considerarse como los dos primeros elementos de la matriz, a <b Significa la relación en la matriz después de la clasificación. En este caso, es una relación incremental. Cuando la sobrecarga es menor que el signo, la estructura o clase llamada puede considerarse como el elemento anterior. La representación interna de la función es la misma que la función cmp. Aquí también está la relación incremental. Pollo comprensión

	bool operator<(const mm&p)
	{
		return r<p.r;
	}
	
	bool cmp(const int &a,const int &b)
	{
    	return a<b;
	}

C cobertura del intervalo de preguntas

Descripción del título

Hay n (1 <= n <= 25000) intervalos cerrados [ai, bi] en la recta numérica. Elija la menor cantidad de intervalos posible para cubrir un segmento de línea específico [1, t] (1 <= t <= 1,000,000).
Cubra todo el punto, es decir (1,2) + (3,4) puede cubrir (1,4).
entrada: La
primera línea: N y T indican el número de intervalo dado y el valor final derecho del intervalo a cubrir La
segunda línea a la línea N + 1: cada línea es un intervalo cerrado.
salida:
el número de intervalos seleccionados, es imposible generar -1

Ideas

Esta vez usamos el punto final izquierdo en orden no decreciente para organizarlo. Para cada valor final izquierdo del registro, debemos encontrar un elemento de la matriz cuyo punto final izquierdo sea menor o igual que el valor final izquierdo del registro actual, y el valor final derecho sea lo más grande posible Actualice para cubrir todo el intervalo con la menor cantidad de intervalos posible.

Código
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;

struct mm
{
	int l,r;
	bool operator<(const mm&p)
	{
		return l<p.l;
	}
};

mm shu[25002];
int n,T,S=1;
int main()
{
	scanf("%d%d",&n,&T); 
	for(int i=0;i<n;i++)
	{
		scanf("%d%d",&shu[i].l,&shu[i].r);
	}
	sort(shu,shu+n);
    int n_x=1,n_y=0,count=0;
    int i=0;
    while(n_x<=T&&i<n)
    {
		if(shu[i].l>n_x) break;
			bool flag = 0;
    	for(;i<n&&shu[i].l<=n_x;i++)
    	{
    		if(shu[i].r>n_y)
    		{
				n_y=shu[i].r;//更新最右值
				flag=1;
			}
		}
		if(flag)
		{
	      count++;
		  n_x=n_y+1;
		} 
    }
   	if(n_x>T) printf("%d\n",count);
	else printf("-1\n"); 
	return 0;
}

Resumen

Al principio, no se tenía en cuenta la necesidad de marcar. Se realizó Count ++ para cada actualización del valor de punto final correcto, lo que resultó en un gran resultado. Se configuró un marcador para indicar que se actualizó el valor correcto, lo que resolvió el problema de agregar una vez más.

20 artículos originales publicados · Me gusta 3 · Visitas 457

Supongo que te gusta

Origin blog.csdn.net/qq_44893580/article/details/104978056
Recomendado
Clasificación