B. The Walkway

发布时间 2023-10-28 16:46:17作者: bhxyry

大意:

B. The Walkway

在一个二维公园中,有n个椅子,从一个一直到另一个椅子的时间为d,有m个卖饼干,分布在$s_i$椅子旁边,

当且仅当以下条件中至少有一个成立时,他才会在$ i$长凳附近吃饼干:

  • 在第 $i$个长凳附近有一个卖饼干的人。那么 Petya 就会从卖饼干的人那里买一块饼干并立即吃掉。
  • Petya 还没有吃过饼干。那么 Petya 会从他的背包里拿出一块饼干并立即吃掉。(当x=1时,吃一个)
  • 距离 Petya 吃上一块饼干至少过去了 $d$ 分钟。换句话说,然后,彼佳将从背包中取出一块饼干并立即吃掉。

去掉一个椅子求吃的最少饼干数,及方案数

思路:

因为一个椅子到它的下一个椅子这个区间吃的饼干数只与这个椅子有关,所以先计算出每个区间的,要吃的饼干数,

再遍历如果去掉这卖饼干的区间$[s[i-1] , s[i+1])$的饼干数与$[s[i-1],i)+[s[i],i+1)$的差,注意边界处理.

对于最后一个要使用向下取整

假设在第一个椅子旁边有一个买饼干的

code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
#define ios                  \
    cin.sync_with_stdio(0);  \
    cin.tie(0);              \
    cout.sync_with_stdio(0); \
    cout.tie(0);
#define endl '\n';
const ll MOD = 1e9 + 7;
int n, m, s[N], d;
void solved()
{
    cin >> n >> m >> d;
    for (int i = 1; i <= m; ++i)
        cin >> s[i];
    int ans = 1;
    int tot[N] = {0};
    s[0] = 1;
    ans = ceil(1.0 * (s[1] - 1) / d);
    for (int i = 1; i < m; ++i)
    {
        ans += ceil(1.0 * (s[i + 1] - s[i]) / d);
        tot[i] = ceil(1.0 * (s[i + 1] - s[i]) / d) + ceil(1.0 * (s[i] - s[i - 1]) / d) - ceil(1.0 * (s[i + 1] - s[i - 1]) / d);
    }
    ans += floor(1.0 * (n - s[m]) / d + 1);
    tot[m] = floor(1.0 * (n - s[m]) / d + 1) + ceil(1.0 * (s[m] - s[m - 1]) / d) - floor(1.0 * (n - s[m - 1]) / d + 1);
    int num = 0, Max = *max_element(tot + 1, tot + 1 + m);
    for (int i = 1; i <= m; ++i)
    {
        // cout << tot[i] << " ";
        if (tot[i] == Max)
            num++;
    }
    cout << ans - Max << " " << num << endl;
}
int main()
{
    ios int t = 1;
    cin >> t;
    while (t--)
    {
        solved();
    }
}