【2020HDU多校】Lead of Wisdom 暴力

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;
}

猜你喜欢

转载自www.cnblogs.com/valk3/p/13374535.html