排列判断
描述
题目有多组测试,每组测试会给出一个长度为 n 的数组 P,你需要用程序判断 P 中的数字是否为一个 1-n 的排列
(包含1-n各一次)。
输入格式
第1行:1个数字t,表示测试的组数(1 < t <= 1000)。之后每组数据两行:
第1行:1个数字n,表示数组的长度(1 < n <= 500)。
第2行:共n个数字P[i],中间用空格分隔,对应数组的元素(1 < P[i] <= 10^9)。
输出格式
输出共t行,对应每一组数据的判断结果,输出“Yes”或者 "No"。
数据范围
1 <= t <= 1000,1 < n <= 500,1 < P[i] <= 10^9
输入样例
2
4
1 2 4 3
4
1 4 2 2
输出样例
Yes
NO
样例解释
1 2 4 3 包含 1-4各一次,所以输出 "Yes",
1 4 2 2 中不包括3,却出现了2个2,所以输出 "No"
说一说哪一部分你有困难呢
意思是,输入4,那么数组元素内容必须是1-4四个数,可以无序?
#include <stdio.h>
#include <string.h>
int main()
{
int i,j,T,n,d,a[500] = {0};
scanf("%d",&T);
for(i=0;i<T;i++)
{
scanf("%d",&n);
memset(a,0,500*sizeof(int));
for(j=0;j<n;j++)
{
scanf("%d",&d);
if(d>=1 && d<=n)
a[d-1]++;
}
for(j=0;j<n;j++)
if(a[j] != 1)
{
printf("No\n");
break;
}
if(j==n)
printf("Yes\n");
}
return 0;
}
int main(int argc, char* argv[])
{
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++)
{
cin >> nums[i];
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum |= 1 << (nums[i]-1);
}
if (sum == (1 << n) - 1)
cout << "yes";
else
cout << "no";
}
int main(int argc, char* argv[])
{
int n=14;
//cin >> n;
vector<int> nums{1,2,3,4,5,6,7,8,9,14,13,12,11,10};
vector<int> sum(9/8+1,0);
/* for (int i = 0; i < n; i++)
{
cin >> nums[i];
}*/
for (int i = 0; i < n; i++) {
sum[(nums[i]-1)/8] |= 1 << ((nums[i]-1)%8);
}
//判断
for (int i = 0; i < n / 8; i++)
{
if (sum[i] != 0xff) {
cout << "No" << endl;
break;
}
}
if (n % 8 != 0) {
if (sum[n / 8] == (1 << (n % 8))-1)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}