Multiescuela eléctrica de Hangzhou — Segunda sesión (Solución del problema)

Es demasiado difícil escribir, porque realmente no lo es. . .

1010 plomo de la sabiduría

Ahora 6772Lead of Wisdom se puede encontrar en la lista de preguntas

Tema

Hay t casos de prueba,
cada caso tendrá primero n, k, n representa que las siguientes n filas tendrán n armas, cada arma es de un tipo diferente y cada una tiene cuatro atributos: a, b, c y d. k representa que hay como máximo k tipos de armas que pueden aparecer.
Solo puede tomar una de cada arma, lo que significa que puede tomar hasta k armas cuando cada arma está disponible. Si no hay tipos de armas, no puede tomar esto, por lo que el número de armas debe ser <= k

El valor requerido esInserte la descripción de la imagen aquí

análisis

La solución a este problema es muy violenta. Es encontrar el valor de cada situación y compararlas a su vez para encontrar el valor máximo. No te preocupes por el tiempo de espera, porque la complejidad del tiempo en este caso es n elevado a k / n, la peor El tiempo es
3 elevado a 16 (50/3), que no es demasiado grande.

No entiendo por qué esta oración degenera tanto, intentaré entenderla después de mirar el árbol de búsqueda. . .
Inserte la descripción de la imagen aquí
Herramientas necesarias:
cnt [k]: el número de armas de cada tipo
siguiente [k]: el siguiente tipo de arma de cada arma, principalmente para armas con cnt [i] = 0, almacenado como su siguiente arma Un tipo de arma distinto de cero, es conveniente dfs directamente
una estructura para almacenar cada arma y sus cuatro valores de atributo. El primer subíndice representa el atributo del arma y el segundo subíndice representa el número del arma (<cnt [i])
struct war { int a, b, c, d; } elemento [55] [55];

Código (AC)

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#include<vector>
#include<stack>
using namespace std;
const int MAX_N = 55;

int n, k;
long long ans;
int cnt[MAX_N];
int nxt[MAX_N];

struct war {
    
    
    int a, b, c, d;
}item[MAX_N][MAX_N];

void solve(int x,int a,int b,int c,int d) {
    
    
    if(x > k) {
    
    
    	//终止条件,到了最后一个属性,计算并比较更新ans 
    	long long temp = (long long)a * b * c * d;
    	if(temp > ans) ans = temp;
    	return;
	}
	
	if(!cnt[x]) {
    
    
		solve(nxt[x],a,b,c,d);
		return;
	}
	for(int i = 1; i <= cnt[x] ; i ++) {
    
    
		solve(x + 1 , a + item[x][i].a , b + item[x][i].b , c + item[x][i].c ,  d + item[x][i].d );
	}
}

int main() {
    
    
	ios::sync_with_stdio(false);
	cin.tie(0);
    int T;
    cin >> T;
    while (T--) {
    
    
    	ans = 0;//每次重新计算清零答案 
    	memset(cnt,0,sizeof(cnt));
        cin >> n >> k;
        int x;
        while(n--) {
    
    
        	cin >> x;
        	cnt[x]++;
        	cin>>item[x][cnt[x]].a>>item[x][cnt[x]].b>>item[x][cnt[x]].c>>item[x][cnt[x]].d;
		}
		//处理next数组
		x = k + 1;
		for(int i = k; i ; i--) {
    
    
			nxt[i] = x;
			if(cnt[i])
				x = i;
		}
        solve(1,100,100,100,100);
        cout<<ans<<endl;
    }
    return 0;
}

Hay un punto muy inexplicable. Después de colocar estos archivos de encabezado, la siguiente matriz informará un error de compilación. Cámbielo a nxt y será ac. Parece que hay un siguiente método con el mismo nombre en un archivo de encabezado de iterador stl, entonces, ¿dónde está? No conozco ninguno.

1001 Total Eclipse

Enlace del título original

Supongo que te gusta

Origin blog.csdn.net/weixin_45203704/article/details/107546085
Recomendado
Clasificación