求助站外题
  • 板块灌水区
  • 楼主ReqCxmChtChr
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/9/28 22:16
  • 上次更新2023/10/27 09:35:53
查看原帖
求助站外题
421451
ReqCxmChtChr楼主2022/9/28 22:16

给一串有n个数字的一串数,依次从中挑出m个数字,组成一个新的数,并使得这个数最大

n<=1e6 m<=1e5

下面蒟蒻代码

#include<bits/stdc++.h>
using namespace std;
int buc[1000100][10],a[1000100];
int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++){
        //cin>>a[i];
        a[i]=rand()%10;
        buc[i][a[i]]=1;
        for(int j=0;j<10;j++){
        	buc[i][j]+=buc[i-1][j];
        	//cout<<buc[i][j]<<" ";
		}
		//cout<<endl;
    }
    int l=1,r;
	bool flag=false; 
    for(int i=m-1;i>=0;i--){
    	r=n-i;
    	int num=0;
    	for(int j=9;j>=0;j--){
    		if(buc[r][j]-buc[l-1][j]>0){
    			num=j;
    			break;
			}
		}
		if(num!=0){
			flag=true;
		}
		if(flag){
			cout<<num;
		}
		int l1=l,r1=r;
		int wantnumber=buc[l-1][num]+1;
		while(l1<=r1){
			int mid=(l1+r1)/2;
			if(buc[mid][num]==wantnumber){
				r1=mid;
				break;
			}
			if(buc[mid][num]<wantnumber){
				l1=mid+1;
			}else{
				r1=mid-1;
			}
		}
		l=r1+1;
    }
    if(!flag){
    	cout<<0;
	}
    //system("pause");
}

样例: IN 5 3 1 8 4 0 9

OUT 849

2022/9/28 22:16
加载中...