Examen escrito de reclutamiento de Alichun 2020.3.20 (Navegación / dp)

Afirmación : Probablemente el título es del área de discusión de Niu Ke. La entrada, la salida y el rango de datos del título también son un poco desconocidos. Solo mire las ideas. Estos detalles no importan QAQ. Por favor corrígeme si hay un error ~
Prueba escrita de Ali 3.20

Tema 1 (Búsqueda de sangre)

Jugando a las cartas 1-10, 4 cartas cada una, 40 cartas en total. Dibuje al azar algunos, una matriz de 10 números 1 1 1 2 2 2 2 2 1 1, que indica el número de cada tarjeta, puede ser cinco rectas, puede ser tres pares para formar un equipo, puede ser un par, puede ser un solo, pregunte al menos cuánto Las cartas se pueden jugar dos veces.
Idea: búsqueda de torrents

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 510;

int a[12];
int ans;
void dfs(int cur) {
	if(cur >= ans) return;
	bool flag = 0;
	for(int i = 1;i <= 10;++i)
		if(a[i]) {
			flag = 1;break;
		}
	if(!flag) {
		ans = cur;return;
	}
	for(int i = 1;i <= 6;++i) {//顺子 
		if(a[i]&&a[i+1]&&a[i+2]&&a[i+3]&&a[i+4]) {
			for(int j = i;j <= i+4;++j)
				a[j]--;
			dfs(cur+1);
			for(int j = i;j <= i+4;++j)
				a[j]++;
		}
	}
	for(int i = 1;i <= 8;++i) {//连对 
		if(a[i]>1&&a[i+1]>1&&a[i+2]>1) {
			for(int j = i;j <= i+2;++j)
				a[j] -= 2;
			dfs(cur+1);
			for(int j = i;j <= i+2;++j)
				a[j] += 2;
		}
	}
	for(int i = 1;i <= 10;++i)
		cur += (a[i]+1)/2; 
	if(ans > cur) ans = cur;
}
int main() {
	for(int i = 1;i <= 10;++i) {
		scanf("%d",&a[i]);
	}
	ans = 40;
	dfs(0);
	printf("%d\n",ans);
} 
/*
1 1 1 2 2 2 2 2 1 1
 
*/

Tema 2 (dp)

La longitud de la cadena no decreciente más larga que puede estar compuesta por un grupo de cadenas no decrecientes. La cadena consta de letras minúsculas.
Idea: dp, uso re pags yo dp_i Personaje un + yo 'a' + i La cadena más larga que termina en necesita ser ordenada primero.

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100010;


int n;
int dp[27];
char str[maxn];
struct node {
	int s,e;
	int len;
	bool operator <(const node &b) {
		if(e == b.e)  return s<b.s;
		return e<b.e;
	}
}a[maxn];

int main() {
	scanf("%d",&n);
	for(int i = 0;i < n;++i) {
		scanf("%s",str);
		a[i].s = str[0]-'a';
		a[i].len = strlen(str);
		a[i].e = str[a[i].len-1]-'a';
	}
	sort(a,a+n);
	for(int i = 0;i < n;++i) {
		int res = dp[a[i].e];
		for(int j = 0;j <= a[i].s;++j) {
			res = max(res,dp[j]+a[i].len);
		}
		dp[a[i].e] = res;
	}
	int ans = 0;
	for(int i = 0;i < 26;++i) {
		ans = max(ans,dp[i]);
	}
	printf("%d\n",ans);
}
/*
4
aaa
bcd
bcdef
zzz
*/
Publicados 152 artículos originales · ganado elogios 2 · Vistas 6444

Supongo que te gusta

Origin blog.csdn.net/weixin_43918473/article/details/105223593
Recomendado
Clasificación