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,先找最合适大小的,然后再找距离最近的,完事。