杭电7029 Median
AC代码:
#include<bits/stdc++.h>
const int N= 1e5+10;
using namespace std;
#define ll long long
ll a[N],b[N];
int main(){
int T;
cin>>T;
while(T--){
ll num=0,n,m;
cin>>n>>m;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<m;i++)cin>>a[i];
sort(a,a+m);
//把第一段放进去 图中红色下划线
b[num++]=a[0]-1;
//再把第二段到第m-1段放进去 图中绿色下划线
for(int i=1;i<m;i++)b[num++]=a[i]-a[i-1]-1;
//最后把最后一段放进去 图中紫色下划线
b[num++]=n-a[m-1];
ll maxnum=0,sum=0,pos=0;
for(int i=0;i<num;i++){
sum+=b[i];
if(b[i]>maxnum){
maxnum=b[i];
pos=i;
}
}
//长度最大的段的数字个数不大于其它段的数字个数之和,一定可以
if(maxnum<=sum-maxnum)cout<<"YES"<<endl;
else{
//长度最大的段的数字个数大于其它段的数字个数之和,则要看该段前面有多少个b[i](最大段前b[i]的个数即pos)
//b[i]个数大于等于配对后剩下的数字个数,则可行(即pos>=manum)
ll tmp=maxnum-(sum-maxnum);
if(pos>=tmp)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}