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/+
+++++++++++++++++++++++++++++++++++++++++++