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 es
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. . .
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.