HDU6772:Lead of Wisdom——題解


http://acm.hdu.edu.cn/showproblem.php?pid=6772

有 $k$ 種物品,每種物品最多只能佩戴一件。對於第 $i$ 個物品,它有四個屬性 $a_i,b_i,c_i,d_i$ 。假設玩家穿戴的物品集合為 $S$ ,玩家的傷害率 $DMG$ 可以通過以下公式計算:

$DMG=(100+∑_{i∈S}a_i)(100+∑_{i∈S}b_i)(100+∑_{i∈S}c_i)(100+∑_{i∈S}d_i)$

請最大化 $DMG$ 。

謹以此題紀念爆〇的模擬。

人傻自帶大常數系列。

暴力即可,復雜度大概就是你假設每組有2個/3個,然后大概能跑得過。

但是我仍然沒想明白我都特判了每個為0的組仍然還是TLE(可能多了個2的常數吧……)

沒辦法按着標程打的。

#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=55;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
ll ans;
int n,k,m,ID[N];
int v[N][N][4],l[N];
void dfs(int i,int a,int b,int c,int d){
    if(i>m){
        ans=max(ans,(ll)a*b*c*d);
        return;
    }
    int id=ID[i];
    for(int j=1;j<=l[id];j++){
        dfs(i+1,a+v[id][j][0],b+v[id][j][1],c+v[id][j][2],d+v[id][j][3]);
    }
}
int main(){
    int T=read();
    while(T--){
        n=read(),k=read(),m=0;
        for(int i=1;i<=k;i++)l[i]=0;
        for(int i=1;i<=n;i++){
            int id=read();
            v[id][++l[id]][0]=read();
            v[id][l[id]][1]=read();
            v[id][l[id]][2]=read();    
            v[id][l[id]][3]=read();
        }
        for(int i=1;i<=k;i++){
            if(l[i])ID[++m]=i;
        }
        ans=0;
        dfs(1,100,100,100,100);
        printf("%lld\n",ans);
    }
}

+++++++++++++++++++++++++++++++++++++++++++

 +本文作者:luyouqi233。               +

 +歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM