列表

详情


NC25577. Watermelon

描述

在ACM队暑假集训的某一天,实验室里有个人。因为天气很热,大家都很想吃西瓜。
于是Eric买了个西瓜拿到了实验室。
Eric把这个人分别编号为,他希望这个人循环轮流来吃西瓜。
也就是说从号开始,然后号,号... 号依次吃西瓜,号吃完后又轮到号来吃,直到这个西瓜被吃完。
而这个人每个人有一个肚量值,第i个人的肚量值为
lililalala是这个人肚量值最大的人,不仅如此,他还非常贪吃,每次轮到他吃西瓜时,都会直接吃掉等同于他的度量值数量的西瓜。如果剩余的西瓜已经不够吃了,那么他会把所有西瓜直接吃完。(是的他很能吃)
除了lililalala以外的其他人,对于第号每次吃西瓜可以选择吃掉中任意整数数量个西瓜。当然,不能超过当前剩余的西瓜数量。
为了使吃西瓜更有意思一些,Eric规定如果在轮到某个人吃西瓜时没有西瓜了,那么由他来打扫一次实验室。(是的大家都很能吃)
其他人都觉得lililalala吃的太多了应该由他来打扫卫生。请问在其他人串通好的情况下能否合理安排每个人的行动使得吃完西瓜后由lililalala来打扫卫生?

输入描述

第一行一个数字--样例个数。 
每个样例包含两行。
第一行两个数字
第二行个数字,以空格分隔。
保证所有样例中肚量最大的人只有一个。这个人是lililalala。
保证所有样例中不超过
保证所有样例中不超过

输出描述

每个样例输出一行,输出”YES”如果合理安排可以使得最后由lililalala来打扫卫生,否则输出“NO”。

示例1

输入:

2  
4 3  
1 2 3 2  
5 8  
1 2 3 2 1

输出:

YES
NO

说明:

第一个样例中lililalala是3号:
一种可行的方案:
1号吃掉1个西瓜
2号吃掉2个西瓜
第一次到3号吃西瓜时就没有西瓜可以吃了,所以3号需要打扫卫生。

第二个样例无论怎样安排各个人在每一次吃西瓜的数量,也不能达成目标。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 153ms, 内存消耗: 3296K, 提交时间: 2019-05-05 15:43:10

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n,m;
		int mx=0;
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++){
			scanf("%d",&a[i]);
			if(a[i]>a[mx])
				mx=i;
		}
		int l=m,r=m,t=-1;
		while(1){
			t++;
			t%=n;
			if(mx==t){
				if(r<=0)
					break;
				l-=a[t];
				r-=a[t];
			}
			else{
				if(l<=0)
					break;
				l-=1;
				r-=a[t];
			}
		}
		if(t!=mx)
			puts("NO");
		else puts("YES");
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 227ms, 内存消耗: 4348K, 提交时间: 2019-05-18 22:13:44

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll t,a[100000],s[100000];
int main(){
	cin>>t;
	while(t--){
		s[0]=0;
		ll n,m,p=1,l,r;
		cin>>n>>m;
		
		for(ll i=1;i<=n;i++)
		{
			cin>>a[i];
			s[i]=s[i-1]+a[i];
			if(a[i]>a[p])p=i;
		}
		if(n==1){printf("YES\n");continue;}
		l=p-1;r=s[p-1];
		while(r<m)
		{
			r+=s[n];
			l+=n-1+a[p];
		}
		if(m>=l&&m<=r)printf("YES\n");
		else printf("NO\n");
	}
}

上一题