NC25577. Watermelon
描述
输入描述
第一行一个数字--样例个数。
每个样例包含两行。
第一行两个数字。
第二行个数字,以空格分隔。
保证所有样例中肚量最大的人只有一个。这个人是lililalala。
保证所有样例中不超过。
保证所有样例中不超过。
输出描述
每个样例输出一行,输出”YES”如果合理安排可以使得最后由lililalala来打扫卫生,否则输出“NO”。
示例1
输入:
2 4 3 1 2 3 2 5 8 1 2 3 2 1
输出:
YES NO
说明:
第一个样例中lililalala是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"); } }