Yzz定义奇偶性相同或|x-y|=1则称他们为“Active pair”
给定一个有n(n为偶数)个元素的有序数组a(从小到大排序),请问是否能有一种划分方式,使得n/2对元素互为“Active pair”
例: a = [11,12,14,16] < 11 12 > ,< 14 16 >
输入
第一行有一个正整数t,表示有t组数据
接下来的每组数据占两行
第一行输入一个正整数n,表示这个有序数组a的长度为n
接下来输入n个整数
(1<=t<=100,2<=n<=105 , Σn<=1e5 , 1<=ai<=1e9 )
输出
如果存在这样的划分方式那么输出"Yes"(不含引号),如果没有输出"No"(不含引号)
样例输入1Copy
2 2 4 9 8 2 3 3 6 8 10 10 10
样例输出1Copy
No Yes
#include<stdio.h>
#include<math.h>
int a[100005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,n,x=0,y=0,z,sum=0,flag=0;
scanf("%d",&n);
int b[100005];
int c[100005];
int d[100005];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
if(a[i]%2!=0)
{
b[x]=a[i];
x++;
}
else
{
c[y]=a[i];
y++;
}
}
if(x%2!=0&&y%2!=0)
{
for(i=0;i<x;i++)
{
for(z=0;z<y;z++)
{
d[sum]=abs(b[i]-c[z]);
sum++;
}
}
}
for(i=0;i<sum;i++)
{
if(d[i]==1)
flag=1;
break;
}
if(x%2==0&&y%2==0||flag==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
我的思路是先把数组分为一个奇数组一个偶数组,两个数组要是下标相同输出YES,下标都为奇数只要其中元素相减为1就输出YES
这是完整代码
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[100005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,n,x=0,y=0,z,sum=0,flag=0;
scanf("%d",&n);
int b[100005];
int c[100005];
int d[100005];
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
if(a[i]%2!=0)
{
b[x]=a[i];
x++;
}
else
{
c[y]=a[i];
y++;
}
}
if(x%2!=0&&y%2!=0)
{
for(i=0;i<x;i++)
{
for(z=0;z<y;z++)
{
d[sum]=abs(b[i]-c[z]);
sum++;
}
}
}
for(i=0;i<sum;i++)
{
if(d[i]==1)
flag=1;
break;
}
if(x%2==0||y%2==0||flag==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}