题目来源: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);
}
} 
京公网安备 11010502036488号