竞赛讨论区 > F 阿宁的二进制 如果用sort+插排可以过吗?
头像
吴警
编辑于 2023-02-03 18:59 江苏
+ 关注

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) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐