求助,#8#11#14Tle
查看原帖
求助,#8#11#14Tle
1121221
caiziming楼主2025/6/30 20:47
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read(){
    int x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return x;
}
void output(int x){
    if(x>9) output(x/10);
    putchar(x%10|48);
}
int n,m,T,dp[100001][4];
bool flag[100001][4];
void work(){
    n=read();
    m=read();
    int answer=0;
    memset(flag,false,sizeof(flag));
    for(int i=1,ma0,ma1,ma2;i<=n;i++){
        ma0=read();
        ma1=m/ma0;
        ma2=m/ma1;
        if(max(ma1,max(ma2,ma0))==ma2){
            flag[i][2]=true;
        }
        if(max(ma1,max(ma2,ma0))==ma1){
            flag[i][1]=true;
        }
        if(max(ma1,max(ma2,ma0))==ma0){
            flag[i][0]=true;
        }
        answer+=max(ma1,max(ma2,ma0));
    }
    output(answer);
    putchar(' ');
    memset(dp,0x3f,sizeof(dp));
    dp[0][0]=0;
    for(int i=1;i<=n;i++){
        if(flag[i][0]==true){
            dp[i][0]=min(dp[i][0],dp[i-1][0]);
            dp[i][0]=min(dp[i][0],dp[i-1][1]);
            dp[i][0]=min(dp[i][0],dp[i-1][2]);
        }
        if(flag[i][1]==true){
            dp[i][1]=min(dp[i][1],dp[i-1][0]+1);
            dp[i][1]=min(dp[i][1],dp[i-1][1]);
            dp[i][1]=min(dp[i][1],dp[i-1][2]);
        }
        if(flag[i][2]==true){
            dp[i][2]=min(dp[i][2],dp[i-1][0]+2);
            dp[i][2]=min(dp[i][2],dp[i-1][1]+1);
            dp[i][2]=min(dp[i][2],dp[i-1][2]);
        }
    }
    output(min(dp[n][1],min(dp[n][2],dp[n][0])));
    puts("");
}
signed main(){
    cin>>T;
    while(T--) work();
}

预期复杂度应该是O(n)O(\sum n),但是TLE

2025/6/30 20:47
加载中...