杭电多校round2 1010 Lead of Wisdom(暴力求解)

##题目翻译
在一个网络游戏中,“智慧引导”是一个幸运的玩家可以随机获得强大物品的地方。
有k种物品,每种物品最多只能佩戴一件。对于第i项,它有四个属性ai、bi、ci和di。假设玩家穿戴的物品集合为S,玩家DMG的伤害率可以通过以下公式计算:
DMG=(100+∑i∈Sai)(100+∑i∈Sbi)(100+∑i∈Sci)(100+∑i∈Sdi)
小Q从“智慧导购”中得到了n件物品,请写一个程序,帮助他选择要穿的物品,这样DMG的价值才能最大化。
输入
输入的第一行包含单个整数T(1≤T≤10),即测试用例的数量。
对于每种情况,输入的第一行包含两个整数n和k(1≤n,k≤50),表示项目的数量和项目类型的数量。
以下n行中的每一行包含五个整数ti、ai、bi、ci和di(1≤ti≤k,0≤ai,bi,ci,di≤100),表示ti类型的项目,其属性为ai、bi、ci和di。
输出
对于每个测试用例,输出一行包含整数DMG的最大值。
样例输入
1
6 4
1 17 25 10 0
2 0 0 25 14
4 17 0 21 0
1 5 22 0 10
2 0 16 20 0
4 37 0 0 0
样例输出
297882000

思路:

第一眼看以为是动态规划,可是状态转移方程我是写不出来。之后试了下搜索(题解是搜索,只是要剪枝),超时了。最后,我是用暴力打出的,其实时间复杂度只有O(n^2),这题的n<50,那是随便过了。
过程比较无脑,每输入一件装备,先判断有没有装过同类型的装备,没装过之间更新最大值。装过,再判断换成新的装备,最大值有没有更新:没更新就不变;更新了就去遍历第一件装备到这件装备,看看会不会有更好的组合。

#include
#define ll long long
using namespace std;
struct node{
 ll num,a,b,c,d;
}w[55];
ll vis[55],id[55],sa,sb,sc,sd;//id记录当前选的这种装备是哪一件,vis记录这种装备有没有被选过,sa,sb,sc,sd记录当前的各项属性值
int main() {
 int t;
   scanf("%d",&t);
   while(t--){
    memset(vis,0,sizeof(vis));
    memset(id,0,sizeof(id));
    int n,k;
 ll maxx=0;
    scanf("%d%d",&n,&k);
     sa=sb=sc=sd=100;
    for(int i=1;i<=n;i++){
    cin>>w[i].num>>w[i].a>>w[i].b>>w[i].c>>w[i].d;
    if(vis[w[i].num]==0){
     sa+=w[i].a;
     sb+=w[i].b;
     sc+=w[i].c;
     sd+=w[i].d;
     id[w[i].num]=i;
     vis[w[i].num]=1;
     maxx=sa*sb*sc*sd;
    }
    else{
     int u=id[w[i].num];
     sa=sa-w[u].a+w[i].a;
     sb=sb-w[u].b+w[i].b;
     sc=sc-w[u].c+w[i].c;
     sd=sd-w[u].d+w[i].d;
    if(maxx

你可能感兴趣的:(题解,c++,算法)