import java.util.*;
public class Main {
static int[] toByte(int tar) {
int[] res = new int[8];
for (int i = 0; i < 8; i++) {
res[i] = (tar >> i) & 1;
}
return res;
}
static class Segment {
int start;
int len;
Segment(int s, int l) {
start = s;
len = l;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int k = in.nextInt();
int m = in.nextInt();
List<Integer> ring = new ArrayList<>();
while (in.hasNextInt()) {
int[] b = toByte(in.nextInt());
for (int x : b) ring.add(x);
}
int total = ring.size();
if (k == 0) {
System.out.println((m + 1) % total);
return;
}
// 拉直环
int[] arr = new int[total * 2];
for (int i = 0; i < total * 2; i++) {
arr[i] = ring.get(i % total);
}
List<Segment> candidates = new ArrayList<>();
// 扫连续 1 段
for (int i = 0; i < total * 2; ) {
if (arr[i] == 1) {
int j = i;
while (j < total * 2 && arr[j] == 1) j++;
int len = j - i;
if (len >= k && i < total) {
candidates.add(new Segment(i, Math.min(len, total)));
}
i = j;
} else {
i++;
}
}
int bestFit = Integer.MAX_VALUE;
int bestDist = Integer.MAX_VALUE;
int answer = -1;
for (Segment seg : candidates) {
int fit = seg.len - k;
if (fit < 0) continue;
int enter;
if (seg.start > m) {
enter = seg.start;
} else {
enter = seg.start + total;
}
int dist = enter - m;
if (fit < bestFit || (fit == bestFit && dist < bestDist)) {
bestFit = fit;
bestDist = dist;
answer = enter % total;
}
}
System.out.println(answer);
}
}
题干说的不明确,从“bit0”到“bit7”,是需要把数据直接转换成的二进制反过来然后存储,要不然每一段的舱段数据就是反的。
举例:59,是:“0, 0, 1, 1, 1, 0, 1, 1,”,实际上的顺序是“1, 1, 0, 1, 1, 1, 0, 0,”
不考虑空间的话,直接把这个环的首尾相接转换成二倍长度的一条直线:
1->2->3->1 转换成 1->2->3->1->2->3
这样就简单了,然后从开始位置直接往后找所有合适的(长度>=k的段),用Segment记录所有的起始位置和长度
然后遍历Segment,先找最合适大小的,然后再找距离最近的,完事。

京公网安备 11010502036488号