你参加了某档电视冲关节目,并走到了最后一关:共有 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;
}