NSUOJ - 暴力 - Problem 3155
程序员文章站
2022-07-12 15:53:01
...
题目来源 http://acm.ccniit.com/problem.php?cid=1201&pid=3
一.题目描述
给你三个整数N,M,Q,和Q个要求ai,bi,ci,di。
构造一个N项的数列A,序列A里面的值都为正整数,满足 Ai ≤ Ai+1 ,最大项AN不超过M,若满足式子Abi - Aai = ci ,则可获得di 点分,求满足条件的序列的最大得分。
Input
第一行输入N,M,Q,下面Q行,每行4个数。
ai bi ci di
……
aQ bQ cQ dQ
2 ≤ N ≤ 10
1 ≤ M ≤ 10
1 ≤ Q ≤ 50
1 ≤ ai < bi ≤ N ( i = 1,2,...,Q )
0 ≤ ci ≤ M - 1 ( i = 1,2,...,Q )
1 ≤ di ≤ 105 ( i = 1,2,...,Q )
(ai,bi,ci ) ≠ ( aj,bj,cj ) ( i ≠ j)
Output
最大得分
Sample Input Copy
3 4 3
1 3 3 100
1 2 2 10
2 3 2 10
Sample Output Copy
110
HINT
这个序列可以为:1 2 4 或 1 3 4
二.解题思路
结构体存获得分数要求 暴力搜索 dfs模拟数列 再跑循环判断当前数列获得的总分数 max取最大值
三.代码
#include <bits/stdc++.h>
using namespace std;
struct p {
int l, r, d, money;
} z[100];
int v[20];
int n, m, num, q;
long long mmax = 0;
void dfs(int x, int step) {
if (step > n) { //模拟数列完成
long long d = 0;
for (int i = 1; i <= q; ++i) {
if (v[z[i].l] + z[i].d == v[z[i].r]) { //满足获得该项分数
d += z[i].money;
}
}
mmax = max(mmax, d);
return;
}
for (int i = x; i <= m; ++i) {
v[step] = i;
dfs(i, step + 1);//模拟数列
}
}
int main() {
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= q; ++i) {
scanf("%d%d%d%d", &z[i].l, &z[i].r, &z[i].d, &z[i].money);
}
dfs(1, 1);
cout<<mmax<<endl;
}
上一篇: NSUOJ 2697