小警告——别把log n不当回事
查看原帖
小警告——别把log n不当回事
1381257
zhengyi0402楼主2024/8/30 09:03

这次我做这道题时,一开始写了一个这样的代码:

#include<bits/stdc++.h>
using namespace std;
int a[111111];
```cpp
map<int,int> m;

 
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,w;
	cin>>n>>w; 
	for(int i = 1;i <= n;i++)cin>>a[i];
	for(int i = 1;i <= n;i++){
		m[a[i]]++;
		int sum = 0;
		for(int j = 600;j >= 0;j--){
			sum+=m[j];
			if(sum>=max(1,i*w/100)){
				cout<<j<<' ';
				break;
			}
		}
	}
	return 0;
	//O(600n)
}

然后嘛。。。。。。

无 【这是一张图,看不见勿喷,谢谢!】

我琢磨了30分钟,突然看了这一句:

map<int,int> m;

对哦,map 会带一个 O(logn)O(log n) 的时间,会不会就是这个 map 搞的?

所以,换了一个代码:

#include<bits/stdc++.h>
using namespace std;
int a[111111];
int m[605];
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,w;
	cin>>n>>w; 
	for(int i = 1;i <= n;i++)cin>>a[i];
	for(int i = 1;i <= n;i++){
		m[a[i]]++;
		int sum = 0;
		for(int j = 600;j >= 0;j--){
			sum+=m[j];
			if(sum>=max(1,i*w/100)){
				cout<<j<<' ';
				break;
			}
		}
	}
	return 0;
	//O(600n)
}

无 【跟上面一样,这张图看不见勿喷,谢谢!】

一片绿色,颇为壮观!

总结

总而言之,O(logn)O(logn) 也是时间,下次超时就找找细节吧!

如果觉得对你有帮助,就点个赞吧!

2024/8/30 09:03
加载中...