题目描述
小武有n个数字,这天小武想将数字理的顺一点,小武要把数字分组,每组的个数都是m,并且这m个 数字连续,小武想知道可以做到吗?
输入格式
第一行一个整数t表示数据组数 对于每组数据, 第一行两个整数n,m 第二行N个非负整数,表示数字
输出格式
如果可以做到输出
“
t
r
u
e
”
“true”
“true”,否则输出
“
f
a
l
s
e
”
“false”
“false”
输入输出样例
输入 #1
3
9 3
1 2 3 6 2 3 4 7 8
6 3
1 2 3 4 6 7
6 3
1 2 3 4 5 6
输出 #1
true
false
true
说明/提示
数据范围
对于30%的数据,
n
<
=
100
n<=100
n<=100,数字
<
=
1000
<=1000
<=1000
对于50%的数据,
n
<
=
1000
n<=1000
n<=1000
对于100%的数据,
1
<
=
m
<
=
n
<
=
10000
,
0
<
=
1<=m<=n<=10000, 0<=
1<=m<=n<=10000,0<=数字
<
=
1
0
9
,
t
<
=
10
<=10^9,t<=10
<=109,t<=10
样例解释
第一组:分成
123
,
234
,
678
123,234,678
123,234,678
第二组:不行
第三组:分成
123
,
456
123,456
123,456
解题思路
听隔壁机房的巨爷说这道题的正解是平衡树。。可惜我太菜了,不会打,看到同机房的某AC爷打模拟也过了,SO,模拟走起。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
int n,k,t,x,w;
bool flag=0,ok;
long long d[11000],v[11000];
int main() {
scanf("%d",&t);
while(t--) {
memset(v,0,sizeof(v));
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
scanf("%lld",&d[i]);
if(k==1)
{
printf("true\n");
continue;
}
sort(d+1,d+n+1);
flag=0;
for(int i=1; i<=n; i++) {
x=i,w=0,ok=0;
if(!v[x])
{
v[x]=1;
for(int j=i+1; j<=n; j++)
{
if(!v[j]&&d[j]-d[x]==1)
{
w++;
v[j]=1;
x=j;
if(w==k-1)
{
ok=1;
break;
}
}
}
if(!ok)
{
flag=1;
printf("false\n");
break;
}
}
}
if(!flag)printf("true\n");
}
}