纯暴力解法,十进制转2进制,然后遍历二进制,记录最小值,不用记录最近值,因为从前往后遍历,找的的最小值一定是最近值。
#include <climits>
#include <iostream>
#include <vector>
using namespace std;
vector<int> trans2Bit(vector<int>& datas) {
vector<int> bits;
for (int& data : datas) {
for (int i = 0; i < 8; i++) {
if (data % 2 == 0) {
bits.push_back(0);
data = data / 2;
}
else {
bits.push_back(1);
data = data / 2;
}
}
}
return bits;
}
void solve(vector<int>& datas, long k, int m) {
vector<int> bits = trans2Bit(datas);
int start = -1;
int minStart = -1;
int len = 0;
int minLen = INT_MAX;
int flag = 0;
for (int i = m + 1; flag != 1; i++) {
if (i == m) flag++;
if (len == 0 && bits[i] == 1) {
start = i;
len = 1;
}
else if (len != 0 && bits[i] == 1) {
len++;
}
else if (len != 0 && bits[i] != 1) {
if (len == k) {
cout << start;
return;
}
if (len > k && len < minLen) {
minStart = start;
minLen = len;
start = -1;
len = 0;
}
else {
start = -1;
len = 0;
}
}
if (i == bits.size() - 1) i = -1;
}
cout << minStart;
return;
}
int main() {
int k, m;
cin >> k >> m;
vector<int> datas;
int x;
while (cin >> x) datas.push_back(x);
solve(datas, k, m);
}

京公网安备 11010502036488号