1 条题解
-
0
解题思路
- 初始化和输入处理:
- 定义二维数组
dp用于存储中间结果,数组aa用于存储输入的数值,变量n表示数组大小,a和b是两个限制值。 - 读取测试用例数量
nc。 - 对于每个测试用例:
- 读取数组大小
n和限制值a、b。 - 读取数组
aa的元素,并对数组进行排序。 - 初始化
dp数组,将所有元素的值设为-100000。
- 读取数组大小
- 定义二维数组
- 深度优先搜索函数
dfs:- 函数
dfs接受两个参数p(当前元素的索引)和person(表示当前是哪个人在选择元素,0和1分别表示不同的人)。 - 如果
p等于n,表示已经遍历完数组,返回0。 - 如果
dp[p][person]大于-100000,说明该状态已经计算过,直接返回dp[p][person]。 - 初始化得分
score为当前元素的值aa[p],结果res为-100000。 - 找到第一个大于
score + a的元素索引i。 - 如果
i等于n,说明没有满足条件的元素,返回dp[p][person] = score。 - 遍历
i到n的元素,调用dfs(i, 1 - person)并更新res。 - 返回
dp[p][person] = score - res。
- 函数
- 主函数
main:- 初始化
i为0,找到第一个大于a的元素索引i。 - 初始化
res为-100000,遍历i到n的元素,调用dfs(i, 0)并更新res。 - 如果
res等于-100000,输出0,否则输出res。
- 初始化
#include<iostream> #include<algorithm> using namespace std; int dp[10001][2], aa[10001], n, a, b; int dfs(int p, int person){ if(p==n) return 0; if(dp[p][person]>-100000) return dp[p][person]; int score = aa[p], res = -100000; int i = p+1; while(i<n&&aa[i]<score+a) i++; if(i==n) return dp[p][person] = score; while(i<n&&aa[i]<=score+b) res = max(res,dfs(i,1-person)), i++; return dp[p][person] = score-res; } int main(){ int nc; cin >> nc; while(nc--){ cin >> n >> a >> b; for(int i = 0; i < n; i++) cin >> aa[i]; sort(aa,aa+n); for(int i = 0; i < n; i++) dp[i][0] = dp[i][1] = -100000; int i = 0; while(i<n&&aa[i]<a) i++; int res = -100000; while(i<n&&aa[i]<=b) res = max(res,dfs(i,0)), i++; if(res==-100000) cout << 0 << endl; else cout << res << endl; } } - 初始化和输入处理:
- 1
信息
- ID
- 679
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 2
- 上传者