Ideal Farm 构造(2400)

在这里插入图片描述
题意 :

  • 将s个物品分为n堆,每堆编号1~n,且保证每堆内至少有一个物品,问是否对于任意的一种物品分配方式都存在一个连续区间 [ l , r ] [l,r] [l,r]使得,这段区间内对应堆中物品数量和为k

思路 :

  • s = k s=k s=k,即每次取所有堆的情况,显然成立
  • s < k s<k s<k,取所有物品也到不了k,显然不成立
  • s > k s>k s>k,考虑能否构造一个所用物品最小,且不满足条件的分配方式(首先想到的是 k + 1 k+1 k+1可以使得物品和不是k,以及连续的 k − 1 k-1 k1个1,这样肯定是不满足条件的分配方式):
    在这里插入图片描述
  • 不难发现这样的构造方式下,需要对每个堆分发一个物品,剩下的物品数量是 s − n s-n sn,而下标为k的倍数的位置,需要再多分配k个物品,总计为 ⌊ n k ⌋ ∗ k \lfloor \frac{n}{k} \rfloor * k knk个物品,那么当 s − n < ⌊ n k ⌋ ∗ k s-n<\lfloor \frac{n}{k} \rfloor * k sn<knk时无法构造
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
 
using namespace std;
 
typedef long long ll;
 
void solve()
{
    
    
    ll s, n, k;
    cin >> s >> n >> k;
    if (s == k) cout << "yes" << endl;
    else if (s < k) cout << "no" << endl;
    else
        cout << (n / k * k > s - n ? "yes" : "no") << endl;
}
 
int main()
{
    
    
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    
    int _  = 1;
    cin >> _;
    
    while (_ -- )
    {
    
    
        solve();
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51448653/article/details/121474134