F 阿宁的二进制 如果用sort+插排可以过吗?
我的思路是先进行一次快排
然后for循环计算每次操作的值到新数组(如果为1,记录最大操作次数跳出循环)
因为每次操作最大数值改了,所以要对a[]重新排序。
但因为数组只有一个位置是无序的,所以插入排序一次循环就行(其实是两次,但O(n)=n)
最后判断k值,大于最大操作次数就输出1,否则输出新数组保存的值就行
但是他报超时啊!!!
但是他报超时啊!!!
但是他报超时啊!!!
不能用插入排序吗?
#include <bits/stdc++.h>
using namespace std;
int count1(int n) {
int count = 0;
while (n > 0) {
if (n & 1 == 1)
count++;
n = n >> 1;
}
return count;
}
void insert_sort(int a[], int n, int flag) {
int fl;
for (int i = 0; i < n; i++) {
if (a[i] > flag) {
fl = i;
break;
}
}
for (int i = n - 1; i > fl ; i--) {
a[i] = a[i - 1];
}
a[fl] = flag;
}
int main() {
int n, q, a[200005], k, r[200005], f;
cin >> n >> q;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
for (int i = 1;i<1000000000; i++) {
a[n - 1] = count1(a[n - 1]);
r[i] = a[n - 2];
insert_sort(a, n, a[n - 1]);
if (r[i] == 1) {
f = i;
break;
}
// cout << r[i] << " ";
}
// cout << endl;
for (int i = 0; i < q; i++) {
cin >> k;
if (k < f) {
cout << r[k];
} else {
cout << "1";
}
if (i != q - 1) {
cout << endl;
}
}
}
查看1道真题和解析