mle求助
查看原帖
mle求助
292029
幽理家的男人楼主2020/9/10 15:33

用二分做的,但是mle了(不知道错在哪里)。

附上代码:

#include<bits/stdc++.h>
using namespace std;
int n,k,vis[100005],ans;
//vis记录元素是否被使用过了,ans记录答案
long long si[100005];//记录元素
int half(int l,int r,long long num){//二分
	if(si[l]==num) return l;
	if(si[r]==num) return r;
	if(l==r-1) return 0;
	int mid=(l+r)/2;
	if(si[mid]==num) return mid;
	else if(si[mid]<num) return half(mid,r,num);
	else return half(l,mid,num);
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;++i) scanf("%lld",&si[i]);
	sort(si+1,si+1+n);
	for(int i=1;i<=n;++i){
	    if(vis[i]) continue;
	    long long base=si[i],ctt=0;
	    for(int j=1;;j++){//找连续相差k被的数
	    	int temp=half(i,n,base);//例如2,2k,2k^2……
	    	if(temp){
	    		ctt++;
	    		vis[temp]=1;
			}
			else break;
			base*=k;
			if(base<si[i]) break;
		}
	    if(ctt%2==0) ans+=ctt/2;//从连续数列中选取k-集合中的元素
	    else ans=ans+ctt/2+1;
	}
	cout<<ans;
}
2020/9/10 15:33
加载中...