每个测试文件均包含多组测试数据。第一行输入一个整数
代表数据组数,每组测试数据描述如下:
第一行输入两个整数
代表数组长度、你需要取出的元素数量。
第二行输入
个整数
代表数组元素。
除此之外,保证单个测试文件的
之和不超过
。
对于每一组测试数据,如果存在至少一种方案,使得最终得到的数组是个严格递增或严格递减数组,在单独的一行上输出
;否则,直接输出
。
4 5 5 1 2 3 4 5 3 2 9 2 4 6 3 12 3 8 7 6 5 5 3 1 3 2 4 5
YES YES YES NO
对于第一组测试数据,不需要进行任何操作,数组已经是严格递增数组。
对于第二组测试数据,选择区间
,随后将这两个元素插入到
之前,得到
。
对于第三组测试数据,符合要求的方案为,选择区间
,随后将剩余的元素重新排列得到
,随后将这三个元素插入到
之后,得到
。
import bisect
def is_single_up(seq: list):
if len(seq) == 1:
return True
delt = [i - j for i, j in zip(seq[1:], seq[:-1])]
if min(delt) > 0:
return True
return False
def is_single_down(seq: list):
delt = [i - j for i, j in zip(seq[:-1], seq[1:])]
if min(delt) > 0:
return True
return False
def is_single(seq: list):
return is_single_up(seq)&nbs***bsp;is_single_down(seq)
def try_seq_son_in_seq_rest(seq_son: list, seq_rest: list, reverse=False):
# 统一处理成单调递增
if reverse:
seq_son = sorted(seq_son)
a, b = seq_son[0], seq_son[-1]
seq_rest = sorted(seq_rest)
if a > seq_rest[-1]&nbs***bsp;b < seq_rest[0]:
return True
else:
if len(seq_rest) == 1:
return False
if (bisect.bisect_left(seq_rest, b) - (bisect.bisect_right(seq_rest, a) - 1)) == 1:
return True
return False
for _ in range(int(input())):
n, m = input().split(' ')
n, m = int(n), int(m)
seq = list(map(int, input().split(' ')))
result = 'NO'
if n > 1e3:
pass
elif is_single(seq):
result = 'YES'
else:
for i in range(n - m + 1):
seq_son = seq[i:i+m]
seq_rest = seq[:i] + seq[i+m:]
if is_single(seq_son):
if try_seq_son_in_seq_rest(seq_son, seq_rest, reverse=(seq_son[-1] - seq_son[0]) <= 0):
result = 'YES'
break
else:
continue
print(result)
def is_up_or_down(s): up = sorted(s) down = sorted(s,reverse=True) if up == s: return 1#up elif down == s: return 2#down else: return False #s1 is up def is_have_up(s1,s2): s2.sort() for i in range(len(s2)+1): if i == 0: if s1[-1] < s2[i]: return True elif i == len(s2): if s1[0] > s2[i-1]: return True else: if s2[i-1] < s1[0] and s1[-1] <s2[i]: return True return False def is_have_down(s1,s2): s2.sort(reverse = True) for i in range(len(s2)+1): if i == 0: if s1[-1] > s2[i]: return True elif i == len(s2): if s1[0] < s2[i-1]: return True else: if s2[i-1] > s1[0] and s1[-1] > s2[i]: return True return False def have_solution(s,m): if len(s) == m: if is_up_or_down(s): return 'YES' else: return 'NO' i = 0 while i + m <= len(s): s_tichu = s[i:i + m] s_shenxia = s[:i] + s[i + m:] if is_up_or_down(s_tichu): if is_up_or_down(s_tichu) == 1: if is_have_up(s_tichu, s_shenxia): return 'YES' elif is_up_or_down(s_tichu) == 2: if is_have_down(s_tichu, s_shenxia): return 'YES' i += 1 return 'NO' n = int(input()) for k in range(n): a,b = map(int,input().split()) shuzhu = list(map(int,input().split())) print(have_solution(shuzhu,b)) #有超时,力竭
import java.util.*;
import java.util.stream.Collectors;
public class Main {
private static final String YES = "YES";
private static final String NO = "NO";
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer num = Integer.parseInt(in.nextLine());
String[] result = new String[num];
for (int i = 0; i < num; i++) {
Integer m = Integer.parseInt(in.nextLine().split(" ")[1]);
String[] data = in.nextLine().split(" ");
List<Integer> list = Arrays.stream(data).map(Integer::parseInt).collect(
Collectors.toList());
result[i] = fun1(list, m);
}
for (int i = 0; i < num; i++) {
System.out.println(result[i]);
}
}
public static String fun1(List<Integer> list, int len) {
List<Integer> sortList = new ArrayList<>(list);
Collections.sort(sortList);
int listSize = list.size();
for (int i = 0; i <= listSize - len; i++) {
List<Integer> ele = list.subList(i, i + len);
String str = fun2(sortList, ele);
if (YES.equals(str)) {
return YES;
}
}
return NO;
}
public static String fun2(List<Integer> resource, List<Integer> target) {
int n = resource.size(), m = target.size();
for (int i = 0; i <= n - m; i++) {
boolean forwardMatch = true, backwardMatch = true;
for (int j = 0; j < m; j++) {
if (!resource.get(i + j).equals(target.get(j))) {
forwardMatch = false;
}
if (!resource.get(n - 1 - i - j).equals(target.get(j))) {
backwardMatch = false;
}
if (!forwardMatch && !backwardMatch) {
break;
}
}
if (forwardMatch || backwardMatch) {
return YES;
}
}
return NO;
}
}