【正经题解】选择客栈
2024-02-21 10:57:52
发布于:美国
16阅读
0回复
0点赞
如果是暴力枚举客栈的话,不能同时枚举两个客栈,那样会超时,所以只能同时枚举一个。我们枚举第二个客栈,然后用第二个客栈反推出前面的方案数。
思路就是,从 到 枚举,输入 和 的值,我们需要记录一个距离第二个客栈最近的咖啡厅价钱合理的客栈位置,用一个 变量记录。
开三个辅助数组, [ ]表示最后一个以 为颜色的客栈的位置, [ ]表示以 为颜色的客栈总数, [ ]可以看作是一个临时数组,用来存储当前的方案数。
可以这么想,当前枚举到一个客栈 ,这个 是第二个客栈,那么显然第一个客栈一定在第二个客栈之前,编号必定是 ~ 之间的一个数。如果我发现枚举的时候在某一个客栈前面有一个价钱合理的咖啡厅,那么在这之前的任何一个同色客栈都是第一个客 栈可以选的,那么统计一下数量,这就是当前的方案数。
然后更新 数组,更新 ,让 [ ] ,这样从左到右地推过来就好了。
这个解法简化于暴力算法,暴力算法要循环三层,一层 客栈,二层 客栈, 层合理的位置,这样做显然不行,而我们做的 就是去优化掉两层,而是从枚举 客栈出发推出 客栈的位置和所有可行方案,所以这样做是正确的。最后输出即可。
#include <iostream>
#define maxn 200005
using namespace std;
int n,k,p;
int color,price;
int last[maxn];
int sum[maxn];
int cnt[maxn];
int ans = 0;
int now;
int main(){
cin >> n >> k >> p;
for (int i=1;i<=n;i++){
cin >> color >> price;
if (price <= p)
now = i;
if (now >= last[color])
sum[color] = cnt[color];
last[color] = i;
ans += sum[color];
cnt[color]++;
}
cout << ans << endl;
return 0;
}
全部评论 1
我的暴力:结构体排序,第一层枚举颜色,第二层枚举客栈,第三层枚举适合的客栈数量,但是答案是错的
2024-10-07 来自 广东
0
有帮助,赞一个