50分TLE求助!
查看原帖
50分TLE求助!
922691
Hisy楼主2023/9/24 15:29
#include<algorithm>
#include<cstdio>
void read(int &number){
	number=0;
	char got=getchar();
	int minus=1;
	while('9'<got||got<'0'){
		if(got=='-'){
			minus=-1; 
		};
		got=getchar();
	};
	while('0'<=got&&got<='9'){
		number=number*10+got-'0';
		got=getchar();
	};
	number*=minus;
};
void write(int number){
    if(number<0){
        putchar('-');
        number=-number;
    };
    if(number>9){
        write(number/10);
    };
    putchar(number%10+'0');
};
int main(int argc,char **argv){
	using std::max;
	using std::min;
	int *cnt=new int[4001001]{0};
	int *sum=new int[4001001]{0};
	int *pln=new int[4001001]{0};
	int maxn,maxm,top,time,ans=1e9;
    read(maxn);
    read(maxm);
    for(int iter=1;iter<=maxn;iter++){
        read(time);
		top=max(top,time);
        cnt[time]++;
		sum[time]+=time;
    };
    for(int iter=1;iter<top+maxm;iter++){
		cnt[iter]+=cnt[iter-1];
		sum[iter]+=sum[iter-1];
	};
    for(int iter=0;iter<top+maxm;iter++){
        pln[iter]=cnt[iter]*iter-sum[iter];
        for(int j=0;j<=iter-maxm;j++){
			pln[iter]=min(pln[iter],pln[j]+(cnt[iter]-cnt[j])*iter-(sum[iter]-sum[j]));
		};
    };
    for(int iter=top;iter<top+maxm;iter++){
		ans=min(ans,pln[iter]);
	};
    write(ans);
    return 0;
};

开了O2 50分TEL,没开O2 25分TLE+RE。

2023/9/24 15:29
加载中...