题目描述
在遥远的提瓦特大陆上,正在筹备一年一度的羽球节,猎鹿人餐厅为犒劳认真筹备的众人,准备了K份甜甜花酿鸡供大家排队领取。
在每一次的排队中,编号为i的角色领取上限为Ai,这意味着他可以领取的甜甜花酿鸡在[1-Ai]范围内。当一个角色领完本次的甜甜花酿鸡,他/她就会回到队列的末尾,直到所有甜甜花酿鸡都被吃完为止。当轮到一个角色领取时,如果所有的甜甜花酿鸡都被领完,那么他/她就要帮大家刷盘子。
贪吃的派蒙每次都吃固定的Ax个甜甜花酿鸡(如果剩下的甜甜花酿鸡的数量比Ax小,那么他就把剩下的都吃完)。我们很容易找到派蒙的编号,Ax比其他所有的Ai都要大。大家都想让派蒙最后留下来刷盘子,请你写一个程序来判断这是否可能。
输入描述:
第一行包含一个整数T(1≤T≤100)T(1≤T≤100)T(1≤T≤100),表示有T组测试数据。
接下来每组测试数据包含两行。
第一行包含两个整数N和K(2≤N≤105,0≤K≤108)N和K(2≤N≤10^5,0≤K≤10^8)N和K(2≤N≤105,0≤K≤108),分别表示人数和甜甜花酿鸡的数量。
第二行包含一个整数Ai(1≤Ai≤109)Ai(1≤Ai≤10^9)Ai(1≤Ai≤109),表示队列中编号为i的角色可以领取甜甜花酿鸡的最大数量。始终只有一个最大的Ax。
输出描述:
如果大家能找到一种方案让派蒙刷盘子,那么输出“YES”。否则输出“NO”。
示例1
输入
1
4 3
1 2 3 2
输出
YES
示例2
输入
1
5 8
1 2 3 2 1
输出
NO
AC的C++代码
#include<iostream>
using namespace std;
int T,N,K,ax,pos,i;
long long sum[100005];
int main(){
cin>>T;
while(T--){
cin>>N>>K;
ax=0;
for(i=1;i<=N;i++){
int x;
cin>>x;
if(x>ax)
ax=x,pos=i;
sum[i]=sum[i-1]+x;
}
//循环不足一个周期 或者 循环了至少一个周期,但是左边人的最大总和要小于k
if(pos>K+1||(sum[N]>=K&&sum[pos-1]<K))
cout<<"NO\n";
else
cout<<"YES\n";
}
}
这是一个关于编程逻辑的题目,描述了一个在提瓦特大陆上的人们如何通过策略让贪吃的派蒙最后刷盘子的问题。程序需要处理不同角色的领取上限,并判断是否能确保派蒙留下。输入包括人数、甜甜花酿鸡数量和每个角色的领取上限,输出是YES或NO,表示能否达成目标。示例展示了不同的测试用例及其结果。
2416

被折叠的 条评论
为什么被折叠?



