P1311 选择客栈

本文详细解析了洛谷P1311客栈问题的算法解决方案,通过枚举每个客栈,寻找满足特定条件的最近咖啡店p1,判断与当前客栈颜色相同的前一客栈位置,统计并累计答案。代码实现使用C++,展示了从暴力解法到优化方案的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面:https://www.luogu.org/problem/P1311

本题先考虑暴力,即枚举每一个客栈,找后面第一个与当前客栈相同颜色且满足最低消费不超过p的客栈,然后统计在此客栈后有多少个与当前颜色相同的客栈,累计入答案即可.
那么正解做法也就自然而然地出来了,即枚举每一个客栈,找一个与之最近的满足条件的咖啡店p1,然后判断上一个与当前客栈相同颜色的客栈是否在p1之前,
如果在就将当前客栈的颜色出现次数统计入答案即可.如果不在就将之前找到过的满足条件的与当前客栈颜色相同的客栈数统计入答案.

Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=200005;
int n,k,p,col[N],cost[N],last[N],cnt[N],lastp,ans,sum[N];
int main(){
    scanf("%d%d%d",&n,&k,&p);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&col[i],&cost[i]);
    }
    for(int i=1;i<=n;i++){
        if(cost[i]<=p){
            lastp=i;
        }
        if(lastp>=last[col[i]]){
            sum[col[i]]=cnt[col[i]];
        }
        last[col[i]]=i;
        cnt[col[i]]++;
        ans+=sum[col[i]];
    }
    printf("%d\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/ukcxrtjr/p/11541479.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值