文章目录
- [The Walkway](https://codeforces.com/contest/1858/problem/B)
- 问题建模
- 问题分析
- 1.分析所求
- 2.如何快速计算每个商贩被去除后的饼干数量
- 代码
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;
}