zoukankan      html  css  js  c++  java
  • 【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
    ",rel);
        }
        return 0;
    }
    
  • 相关阅读:
    2016中国大学生程序设计竞赛
    POJ 2239 化二分图右集合二维为一位的最大匹配
    POJ 1274 二分图最大匹配简单单向
    二分图最大匹配模板
    找割点和割边
    HDU 4432 求因子+进制转换
    HDU 4438 概率 多个情况下的数学期望
    HDU 4424 并查集+贪心思想
    POJ 1611 记录节点数的并查集
    HDU 4430 二分查找
  • 原文地址:https://www.cnblogs.com/valk3/p/13374535.html
Copyright © 2011-2022 走看看