小塔最近在玩一款培育养成类游戏,她培育的角色有 n 个属性,每个属性 Ai 是 0 到 K 的一个整数。这个游戏的终极目标是在最后的展示大会上获得最高的评分,最后的展示大会上有一些评委,每个评委都有各自的评判标准,当你达成了这个评委的评判标准,你就能获得这个评委的评分,评委的评判标准格式如下,可以由一个整数七元组 表示。
当 op 为 0 时,代表培育的角色满足 a × Ai + b × Aj ≤ d 时就可以获得 v 的评分。
当 op 为 1 时,代表培育的角色满足 a × Ai + b × Aj ≥ d 时就可以获得 v 的评分。
由于评委们也不想让自己的评分规则太麻烦,所以这里的a, b满足 - 1 ≤ a, b ≤ 1。
如果小塔能控制她养成的角色的属性的值,现在她问你她最高能在展示大会上获得多少评分呢?
Input
第一行两个整数 n, m, k (2 ≤ n ≤ 6, 1 ≤ m ≤ 100, 1 ≤ K ≤ 8)。
接着有 m 行,每行有七个整数 i, j, op, a, b, d, v,表示一组评委的评判标准。其中每个参数的具体限制如下:
Output
输出一个整数代表她可以获得的最高评分
Examples
Inputcopy Outputcopy
3 5 5
3 1 0 1 -1 0 4
3 1 0 1 1 2 2
3 1 0 1 0 1 3
3 2 1 1 1 2 0
3 2 1 1 -1 1 3
12
Inputcopy Outputcopy
3 5 5
1 2 1 -1 0 0 0
3 2 1 0 -1 3 2
2 3 0 -1 -1 0 4
3 1 1 1 0 0 0
1 3 0 0 1 2 9
13
Note
在第一个样例里,小塔培养的角色属性为 A1 = 1, A2 = 0, A3 = 1 时,可以获得 12 分。
(op ∈ 0,1,1 ≤ i,j ≤ n,i= j,−1 ≤ a,b ≤ 1,−10 ≤ d ≤ 10,0 ≤ v ≤ 108)
题目大意:获得最高的评分,数据范围很小6^8*100,可以直接枚举出所有属性值,依次判断是否符合裁判的评分要求,每次枚举出的分数取最大的
代码实现
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
struct x
{
int i,j,op,a,b,d,v;
}b[110];
signed main()
{
std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n,m,k;cin>>n>>m>>k;
for(int p=1;p<=m;p++)
{
cin>>b[p].i>>b[p].j>>b[p].op>>b[p].a>>b[p].b>>b[p].d>>b[p].v;
}
int c[10];
int mx=INT_MIN,t;
for(c[1]=0;c[1]<=k;c[1]++)
for(c[2]=0;c[2]<=k;c[2]++)
for(c[3]=0;c[3]<=k;c[3]++)
for(c[4]=0;c[4]<=k;c[4]++)
for(c[5]=0;c[5]<=k;c[5]++)
for(c[6]=0;c[6]<=k;c[6]++)
{
t=0;
for(int p=1;p<=m;p++)
{
if(b[p].v==0) continue;
if(b[p].op==0)
{
if(b[p].a*c[b[p].i]+b[p].b*c[b[p].j]<=b[p].d)
t+=b[p].v;
}
else if(b[p].op==1)
{
if(b[p].a*c[b[p].i]+b[p].b*c[b[p].j]>=b[p].d)
t+=b[p].v;
}
}
mx=max(mx,t);
}
cout<<mx;
return 0;
}