D 全都拿走(计蒜客 联盟周赛)

你参加了某档电视冲关节目,并走到了最后一关:共有 N件物品给你挑选,且对物品 i,其价格 value[i]满足关系: i∀i∈[1,N],value[i]∈[1,N],且∀i∈[1,N],∀j∈[1,N],i!=j 有 value[i] != value[j]。给你 K 次将这些物品砍价的机会,每次砍价可以选择任意 PP 件物品)(P≤N),将它们同时砍掉 C 元,但物品在被砍价后其价格不能为负数。若你在使用 Q(Q≤K) 次机会后,所有物品的价格都被减为 0元,则你可以将所有物品带走。请问你能把这些物品带走吗?因为情况非常紧急,你只有 2000ms2000ms 的机会思考,若能则输出"Yes",若不能输出则"No"(双引号不需输出)。

输入格式
单组输入,每组输入的第一行包含两个数 N,K(K(N∈[1,200,000],K∈[1,10,000]),分别为 N 件物品,K 次砍价机会。第二行为 N 个数,为 N 件物品分别的价格。

输出格式
如题意进行输出你是否能将所有物品带走。

输出时每行末尾的多余空格,不影响答案正确性

样例输入
2 1
样例输出
No
样例解释
对(2,1)你只有一次砍价机会,若你选择砍 1 元,则物品价格可能砍为(2,0)或(1,1)或(1,0),不满足带走的条件;若你选择砍 2 元,则物品价格则变为(0,1),也不满足带走的条件。你无法选择砍 2元以上,因为砍价后物品价格一定会变为负数。

故你无法在一次砍价内将所有物品砍为 0 元,输出 "No"

 

思路: 因为i∀i∈[1,N],value[i]∈[1,N],并且不允许重复,所以当n为3时,a[i]只能是1 2 3,只是顺序不同而已。

          首先我们先找出1~n的中位数mid,让1~n中能减mid的减去mid,其中1~n的最大值就变成了n/2,一直向下直到n变为0.

         其实就是每次将大于中位数的都减去中位数。

AC代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <set>
#define eps 0.0000000001
#define inf 0x3f3f3f3f
const int M=1e4+10;
using namespace std;
typedef long long ll;
int main()
{
    ll n,k,i,j,a,ans=0;
    cin>>n>>k;
    for(i=0;i<n;i++)
        cin>>a;
    while(n)
    {
       n/=2;
       ans++;
    }
    if(ans>k)
        cout<<"No"<<endl;
    else
        cout<<"Yes"<<endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值