题目来源:2020杭电多校第二场
题意
给定n件物品,每个物品具有类型t和a,b,c,d四个属性,最大的属性编号为k,每种类型物品选一件,求下列代数式的最大值。
数据范围
10组数据。 时间为8s。
思路
暴力搜索。理论上最大复杂度不超过。
要注意的是序号的处理,比如样例还有类型序号为124的物品但是没有3,所以需要离散化。添加空节点会超时,所以先排序之后用set维护当前类型数量。
代码
#include <bits/stdc++.h> using namespace std; typedef long long ll; int ca,n,k; ll mx = 0; vector<int> v[55]; set<int> s; struct node { int t,a,b,c,d; }e[105]; void dfs(int t, int a, int b, int c, int d) { if(t==s.size()) { mx = max(mx, 1LL*(100+a)*(100+b)*(100+c)*(100+d)); return; } for(int i=0;i<v[t].size();i++) { dfs(t+1, a+e[v[t][i]].a,b+e[v[t][i]].b,c+e[v[t][i]].c,d+e[v[t][i]].d); } } int cmp(node x, node y) { return x.t < y.t; } int main() { // freopen("in.txt", "r", stdin); scanf("%d",&ca); while(ca--) { scanf("%d%d",&n,&k); memset(e,0,sizeof(e)); for(int i=0;i<55;i++) v[i].clear(); mx = 0; s.clear(); for(int i=1;i<=n;i++) { scanf("%d%d%d%d%d",&e[i].t,&e[i].a,&e[i].b,&e[i].c,&e[i].d); s.insert(e[i].t); } sort(e+1,e+n+1,cmp); int mp[55], id = 0; for(set<int>::iterator it=s.begin();it!=s.end();it++) { mp[(*it)]=id; id++; } for(int i=1;i<=n;i++) { v[mp[e[i].t]].push_back(i); } dfs(0,0,0,0,0); printf("%lld\n", mx); } }