ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

G - 贪吃的派蒙(贪心)

2021-01-31 18:31:48  阅读:204  来源: 互联网

标签:typedef const int max ll 贪吃 pmax 贪心


传送门


题目大意

给出一个序列 p p p,每个数代表一个人要吃东西的数量。其中最大的数为派蒙,除了派蒙之外每个人每次能吃的数量为 [ 1 , p i ] [1,p_i] [1,pi​],派蒙每次固定的吃 p m a x p_{max} pmax​个。给定 k k k个食物,问能否让派蒙之前的那个人恰好吃完。

解题思路

设派蒙前面的人能吃的数量范围是 [ a , b ] [a,b] [a,b],那么如果 a ≤ k ≤ b a \leq k \leq b a≤k≤b显然一定成立。否则就必须要让派蒙吃到东西,而派蒙前面的人恰好为分界点,也就是说把这里当做终点,设除了派蒙之外的人能吃的数量范围是 [ c , d ] [c,d] [c,d],那么经过若干个周期 T T T后,食物消减的范围就是 T ∗ x , x ∈ [ c + p m a x , d + p m a x ] T*x,x\in[c+p_{max} , d+p_{max}] T∗x,x∈[c+pmax​,d+pmax​],也问题转化成了,能否找到 T T T满足 k   ∣   ( T ∗ x ) , x ∈ [ c + p m a x , d + p m a x ] k~|~(T*x) ,x\in[c+p_{max} , d+p_{max}] k ∣ (T∗x),x∈[c+pmax​,d+pmax​]。

假设固定只取最小的,那么求出来的值是固定的,因为没有办法比它更小,得到 ⌊ k − a b + p m a x ⌋ \lfloor \frac{k - a}{b+ p_{max}} \rfloor ⌊b+pmax​k−a​⌋,那么最终得到的 T T T的范围是 [ 1 , ⌊ k − a b + p m a x ⌋ ] [1,\lfloor \frac{k - a}{b+ p_{max}} \rfloor] [1,⌊b+pmax​k−a​⌋],也就是说,只要 1 ≤ ⌊ k − a b + p m a x ⌋ ] 1 \leq \lfloor \frac{k - a}{b+ p_{max}} \rfloor] 1≤⌊b+pmax​k−a​⌋]就可以满足题意。


//
// Created by Happig on 2021/1/30.
//
#include <bits/stdc++.h>
#include <unordered_map>

using namespace std;
#define ENDL "\n"
#define lowbit(x) (x & (-x))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
const double eps = 1e-8;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double dinf = 1e300;
const ll INF = 1e18;
const int Mod = 998244353;
const int maxn = 3e5 + 10;

ll x[maxn];

int main() {
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t, n;
    ll k;
    cin >> t;
    while (t--) {
        cin >> n >> k;
        ll pm = 0;
        for (int i = 1; i <= n; i++) {
            cin >> x[i];
            pm = max(pm, x[i]);
        }
        ll a = 0, b = 0, c = n - 1, d = 0;
        bool ok = 1;
        for (int i = 1; i <= n; i++) {
            if (x[i] == pm) {
                a = i - 1;
                ok = 0;
            }
            if (ok) b += x[i];
            d += x[i];
        }
        if (a <= k && k <= b) {
            cout << "YES" << ENDL;
            continue;
        }
        ll r = (k - a) / (c + pm);
        if (1 <= r) cout << "YES" << ENDL;
        else cout << "NO" << ENDL;
    }
    return 0;
}

标签:typedef,const,int,max,ll,贪吃,pmax,贪心
来源: https://blog.csdn.net/qq_44691917/article/details/113482085

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有