C题流氓写法(
可以发现,只需要在排序后的数组中,找到长度为 的区间内,
个数形成等比数列 or 再加
个数后
个数形成等比数列
即可。注意到如果满足以上条件,这个区间的两端端点的值之差分别为:
or
所以只需要遍历从 (下标从1开始)到
,每次判断该点和该点对应的长度
的区间的左端点的值之差即可。
for(int iii=0;iii<t;iii++)
{
suc=0;//记录是否已经找到过符合条件的区间端点
cin>>n>>m;//输入
for(int i=1;i<=n;i++)
cin>>a[i];
if(m>n+1){cout<<"NO"<<endl;continue;}//特判,n再加上1个棋子也不够m个
if(m==2&&n>=1){cout<<"YES"<<endl;continue;}//特判,m为2时只要有棋子一定成立。
sort(a+1,a+n+1);//排序
for(int i=m-1;i<=n;i++)
{
if(a[i]-a[i-(m-1)+1]==m-2||a[i]-a[i-m+2]==m-1)
{cout<<"YES"<<endl;
suc=1;break;}
}
if(!suc)cout<<"NO"<<endl;
}

京公网安备 11010502036488号