Codeforces Round 893 (Div. 2)B题题解

The Walkway

在这里插入图片描述在这里插入图片描述

问题建模

给定n个椅子,其中有m个位置存在商贩,在商贩处必须购买饼干吃,每隔经过d个椅子需要消耗饼干,在初始椅子1处也需要吃饼干,现在可以去除一个商贩,问去除一个商贩后所需消耗的饼干数量最小为多少,以及符合要求的商贩数量。

问题分析

1.分析所求

题目需要输出一个最小的饼干数量,以及对应符合要求的商贩数量。则可以考虑采用枚举计算每个商贩缺失后所需的饼干数量,取数量最小的情况即可。

2.如何快速计算每个商贩被去除后的饼干数量

由于到商贩处必须买饼干,也就是到商贩处计算椅子的间隔需要重新计算,则只需按商贩间隔计算饼干数量即可。由于只去除一个商贩,则可以预处理出所有商贩都存在的饼干数量,然后计算出去除商贩所需饼干数最少的情况即可。

代码
#include<bits/stdc++.h>

#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N = 1e5+10, INF = 0x3f3f3f3f;
int s[N];

void solve() {
    int n,m,d;
    cin >>n >>m >>d;
    for(int i=1;i<=m;i++)   cin >>s[i];
   ///计算方便计算第一个椅子和最后一个椅子到商贩的间隔
    s[0]=1-d,s[m+1]=n+1;
    int ans=m;
    for(int i=0;i<=m;i++)   ans+=(s[i+1]-s[i]-1)/d;
    int val=0,cnt=0;///计算去除商贩后减少饼干数量最多的
    for(int i=1;i<=m;i++){
        int a=s[i]-s[i-1]-1;
        int b=s[i+1]-s[i]-1;
        int c=s[i+1]-s[i-1]-1;
        if(val<a/d+b/d-c/d+1)   val=a/d+b/d-c/d+1,cnt=1;
        else if(val==a/d+b/d-c/d+1) cnt++;
    }
    cout <<ans-val <<" " <<cnt<<'\n';
}

int main() {
    int t = 1;
    cin >> t;
    while (t--) solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值