empleos week3-

A - número de problemas de la elección

Significado de las preguntas:

Dado n número positivo, para elegir el K y estos números es S, un total de cuántos ley electoral.


ideas:

Esta pregunta es el primero en utilizar DFS búsqueda en profundidad, es decir, desde el punto de partida para explorar la parte posterior, una vez que se encontró que la elección no cumple con los requisitos, puede elegir otro punto de nuevo, una y otra vez para explorar, para obtener el número seleccionado para el K y S están todos .
Esto significa que el primer número desde el principio, atravesando todos los números. Cada número ha marcado y sin marcar ambos casos, la necesidad de utilizar la recursividad para resolver. Recursiva al podar, es posible reducir en gran medida la complejidad del algoritmo. Cuando se determina que el tiempo y S es el número de 1 de la. Hasta que el número de recorrido completo de todas las opciones o seleccionada> K cuando se poda.

código:

#include<iostream>
#include<list>
#include<string>
#include<algorithm>
using namespace std;
#define _for(i,a,b) for(int i=a;i<b;i++)
int T, n, K, S;
int m[16];
list<int> res;
int step=0;

void solve(int i, int K,int sum)
{
	if (res.size() == K && sum == 0) 
	{
		step++;
		return;
	}
	if (i >= n) return;
	if (res.size() > K || sum < 0) return;
	solve(i + 1, K, sum); //选中,放入链表中
	res.push_back(m[i]);
	solve(i + 1, K, sum - m[i]); //不选
	res.pop_back(); //不选的话,将该数从链表里弹出删除

}
int main()
{
	cin >> T;
	_for(i, 0, T)
	{
		cin >> n >> K >> S;
		_for(j, 0, n)
		{
			cin >> m[j];
		}
		solve(0, K, S);
		cout << step << endl;
		step = 0;
	}
	return 0;
}

B - punto de ajuste de intervalo

Significado de las preguntas:

Con n intervalo cerrado [a_i, b_i] línea de números. Tomar como algunos puntos, de tal manera que tienen al menos un punto (punto puede ser secciones diferentes que contienen el mismo) en cada intervalo

Entrada:
La primera línea de un número entero N (N <= 100)
de 2 ~ N + 1 líneas, cada dos enteros a, b (a, b < = 100)

: Salida
número un entero que representa el punto seleccionado,

ideas:

En primer lugar necesidad de encontrar indicadores codiciosos debe ser visto gradualmente para determinar el valor del punto correcto, seremos capaces de lograr los objetivos que necesitamos. Debe ser de acuerdo con todas las secciones del punto correcto b de pequeño a grande, de ordenar un buen primer punto del rango del punto de máxima derecha derecha y comenzó a juez, si el punto de izquierda después de que el primer intervalo del extremo derecho de un punto menor que el intervalo, entonces es necesario tener un multi-punto, el extremo derecho de la sección derecha de la cubierta del punto máximo, un caso de realización sección de evaluación. Si es mayor que o igual, esto significa que el punto extremo derecho de la sección, y el punto final derecho recicla entonces a la izquierda del punto de la siguiente sección actual se comparan, hasta la finalización de todo el intervalo de comparación. El número de las estadísticas para el valor de lo que queremos.
Intervalos alrededor de la estructura pueden ser representados.
Debido a que no se inician una consideración rigurosa, se determina de tal manera que el primer punto es menor que una sección de la derecha wa con frecuencia salido del punto final del intervalo es igual a uno, algunos detalles pequeños aún necesitan atención.

código:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
#define _for(i, a, b) for(int i=a;i<b;i++)


struct section
{
	int a;
	int b;
	bool operator < (const section& s)const
	{
		if(b!= s.b)
			return b <s.b ;
		else
			return a > s.a;
	}
}s[1000];

bool cmp(const int &s1 ,const int &s2)
{
	return s1>s2 ;
}
int main()
{
	int N;
	cin >> N;
	int end=-1;
	int count = 0;
	_for(i, 0, N)
	{
		cin >> s[i].a >> s[i].b;
	}
	sort(s, s + N);
	_for(i, 0, N)
	{	
		if (end< s[i].a)
		{
			end=s[i].b;
			count++;
		}
	}
	cout << count << endl;
	return 0;
}

C - La cobertura de intervalo

Significado de las preguntas:

Hay una línea de número n (1 <= n <= 25 000) un intervalo cerrado [ai, bi], seleccionado para cubrir un rango de tan poco como segmento especificado [1, t] (1 < = t <= 1.000.000).
Cubriendo el punto entera, es decir, (1,2) + (3,4) puede cubrir (1,4).
La salida imposible -1

Entrada:
Primera línea: N T y la
segunda fila N + 1 a la fila: cada línea de un intervalo cerrado.
Salida:
el número de secciones seleccionadas, las salidas imposibles -1.


ideas:

Esta pregunta es una locura en su cara, parecía un pequeño problema sólo lo hacen, no tuvo en cuenta (1,2) (3,4) puede ser cubierta (1,4) caso, para que wa frecuente. Aunque intentado muchas muestras, pero sigue siendo incorrecto, sólo se conecta a los estudiantes me mostraron a cabo. La lectura de las preguntas hay que tener cuidado cuidado cuidado.
Mediante el uso de una estructura representada intervalo.
La primera es la necesidad de encontrar un índice adecuado codiciosos, podemos ver rango de 1-t, si todo el punto de partida del intervalo no es un imposible hacerlo. Es decir, un punto de la izquierda intervalo cerrado de pequeño a grande, y luego atraviesan todas las secciones, seleccione el punto de partida para los intervalos más largos de 1, que se fija a 1 punto de punto de partida adecuado, y luego repetir el proceso y será capaz de obtener el resultado deseado.


código:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std; 
#define _for(i,a,b) for(int i=a;i<b;i++)

struct section
{
	int a;
	int b;
	bool operator <(const section &s1) 
	{
		if(a!=s1.a) return a<s1.a;
		else return b>s1.b; 
	}
	
}s[25001];

int main()
{
	int N, T,a,b;
	int count=1; //计数所用	
	scanf("%d %d", &N, &T);
	_for(i, 0, N)
	{
		scanf("%d %d", &a, &b);
		if(a<1) s[i].a=1;  //防止输入错误情况(考虑多了) 
		else s[i].a=a;
		if(b>T) s[i].b=T;
		else s[i].b=b;
	}	
	sort(s, s+ N);
	int maxb=s[0].b;
	int start=1;  //起点设置为1 
	if(s[0].a!=1)  //第一个区间起点不是1,则无解 
	{
		cout<<-1<<endl;
		return 0;
	}
	 
	_for(i,0,N)
	{
		if(s[i].a<=start)  //左端点小于等于起始点 
			maxb=max(maxb,s[i].b); //选择最大的右端点 
		else
		{
			count++; //否则那就需要多取一个区间 
			start=maxb+1;   //将起点设置为最大右端点+1 
			if(s[i].a<=start)   
				maxb=s[i].b;
			else
			{
				cout<<-1<<endl;
				return 0;
			}
			
		}
		if(maxb==T) //到达T 
		{
			cout<<count<<endl;
			return 0;
		}
		
	}
	cout<<-1<<endl;
	return 0;
}
Publicado siete artículos originales · ganado elogios 0 · Vistas 124

Supongo que te gusta

Origin blog.csdn.net/weixin_44465341/article/details/104980551
Recomendado
Clasificación