题意:
。。。
思路:
我们定义(i,j)表示两个人住在i,j客栈。1<=i<j<=n
只有当(i,j)中的费用全部大于p时,(i,j)才不是解。
所以由此很容易得出一个组合算法。
LL go(int x) {
LL ret = 0, sum = 0;
rep(i, 1, n) sum += (c[i] == x);
if (sum < 2) return 0;
dp[0] = 0;
rep(i, 1, n) {
if (v[i] <= p) {
dp[i] = 0;
continue;
}
if (c[i] == x) {
ret += dp[i-1];
dp[i] = dp[i-1] + 1;
}
else {
dp[i] = dp[i-1];
}
}
//cout << "sum, ret: " << sum << ' ' << ret << endl;
ret = sum*(sum-1)/2 - ret;
//cout << "color " << x << ": " << ret << endl;
//cout << "dp: ";rep(i, 1, n) cout << dp[i] << ' ';cout << endl;
return ret;
}
LL solve() {
LL ans = 0;
rep(i, 0, k-1) ans += go(i);
return ans;
}
本文介绍了一种使用组合算法解决特定住宿费用问题的方法。通过定义(i, j)表示两个人住在不同的客栈,并且只有当所有费用都大于某个阈值p时,(i, j)才不构成解。基于此,文章提出了一种有效的算法来计算满足条件的住宿组合数量。
3513

被折叠的 条评论
为什么被折叠?



