原题链接:https://codeforces.com/contest/1399/problem/A
题意:如果两个数相差为1就删除小的数,如果两个数相同就删除任意一个,给定一个序列,我们判断经过这个规则后序列数目最后能不能只剩下一个?
解题思路:此题利用队列实现比较方便,我们用一个数组存储输入数组,再进行排序(题中并没有说已经排好序了),之后再全部入队,判断每次不能删除的数目,即最后剩下来的数目。我们这样做,取队头元素,再出队一个,再去队头元素,这两个进行判断即可,若相差小于等于1,则说明删除成功,否则+1,同时我们再比较过程中也要判断队列是否为空。
AC代码:
/*
*/
//低版本G++编译器不支持,若使用这种G++编译器此段应注释掉
//i为循环变量,a为初始值,n为界限值,递增
//i为循环变量, a为初始值,n为界限值,递减。
using namespace std;
const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为代码自定义代码模板***************************************//
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
ios::sync_with_stdio(false);//打消iostream中输入输出缓存,节省时间。
cin.tie(0); cout.tie(0);//可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
int t,n,nums[55];
while(cin>>t){
while(t--){
cin>>n;
queue<int> q;
rep(i,0,n-1){
cin>>nums[i];
}
sort(nums,nums+n);
rep(i,0,n-1){
q.push(nums[i]);
}
int sum=0;//统计不能删除的数。
int temp,temp1;
while(!q.empty()){
temp=q.front();
q.pop();
if(q.empty()){
sum++;
break;
}
temp1=q.front();
if(temp1-temp>1){
sum++;
}
}
if(sum==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}