【2020HDU多校】Lead of Wisdom 暴力
题意
给出 n 个技能,每个技能有 4 个属性: a , b , c , d ,每个技能属于一个分类,最多有 k 个分类,每个分类的技能只能学一种,假如最后选定的技能集合为 S,最终可以造成的伤害为:\(DMG=(100+\sum_{i∈s}a_i)*(100+\sum_{i∈s}b_i)*(100+\sum_{i∈s}c_i)*(100+\sum_{i∈s}d_i)\),求最大的伤害为多少?
(1≤n,k≤50), (1≤ti≤k, 0≤ai,bi,ci,di≤100)。
题解
乍一看数据范围以为是DP。。。
暴力题,唯一的优化就是只有一种技能的分类不需要 dfs 。
代码
/*
* @Autor: valk
* @Date: 2020-07-17 16:50:40
* @LastEditTime: 2020-07-24 09:43:35
* @Description: 你背叛了工人阶级,操 你妈!
*/
#include <bits/stdc++.h>
#define emplace_back push_back
#define pb push_back
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 10;
struct note{
int a,b,c,d,id;
}arr[N];
bool cmp(note a,note b){
return a.id<b.id;
}
vector<int>vec[N],v[N];
ll rel,sa,sb,sc,sd;
int n,k,cnt;
void dfs(int u,int a,int b,int c,int d){
if(u==cnt+1){
rel=max(rel,1LL*(sa+a)*(sb+b)*(sc+c)*(sd+d));
return ;
}
for(auto j:v[u]){
dfs(u+1,a+arr[j].a,b+arr[j].b,c+arr[j].c,d+arr[j].d);
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
rel=0,cnt=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=50;i++) {
vec[i].clear();
v[i].clear();
}
for(int i=1;i<=n;i++){
scanf("%d%d%d%d%d",&arr[i].id,&arr[i].a,&arr[i].b,&arr[i].c,&arr[i].d);
vec[arr[i].id].pb(i);
}
sa=100,sb=100,sc=100,sd=100;
for(int i=1;i<=k;i++){
int len=(int)vec[i].size();
if(len<1) continue;
if(len==1){
sa+=arr[vec[i][0]].a;
sb+=arr[vec[i][0]].b;
sc+=arr[vec[i][0]].c;
sd+=arr[vec[i][0]].d;
}
else{
++cnt;
for(int j:vec[i]){
v[cnt].pb(j);
}
}
}
dfs(1,0,0,0,0);
printf("%lld\n",rel);
}
return 0;
}