这题解决超时也太暴力了吧
查看原帖
这题解决超时也太暴力了吧
898243
demask楼主2024/4/26 22:47

如果循环里面只一次,最后两个测试点会超时,但是暴力的加成三次,就可以过了^v^

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a;
    cin>>a;
    int b[a+3]={};
    for(int i=0;i<a;i++)
        cin>>b[i];
    int k1=1,k2=0,all=0;
    int o=0;
    while(k1!=0){
        int p1=0,p2=-1;//记录长度和初始坐标 
        if(o==0){//判断是否需要重新找出最长 
            o=1;
            k1=0;k2=0;//储存最长长度和初始坐标 
            for(int i=0;i<a;i++){
                if(b[i]!=0){
                    p1++;
                    if(p2==-1)p2=i;
                }
                if(b[i]==0){
                    if(p1>k1){
                       k1=p1;k2=p2;
                    }
                    p1=0;p2=-1;
                }//第一次 
                i++;
                if(b[i]!=0){
                    p1++;
                    if(p2==-1)p2=i;
                }
                if(b[i]==0){
                    if(p1>k1){
                       k1=p1;k2=p2;
                    }
                    p1=0;p2=-1;
                }//第二次 
                i++;
                if(b[i]!=0){
                    p1++;
                    if(p2==-1)p2=i;
                }
                if(b[i]==0){
                    if(p1>k1){
                       k1=p1;k2=p2;
                    }
                    p1=0;p2=-1;
                }//第三次
            }
            if(p1>k1){
                    k1=p1;
                    k2=p2;
            }
        }
        for(int i=k2;i<(k2+k1);i++){
            b[i]--;
            if(b[i]==0)o=0;//当前最长是否被破坏 
        }
        if(k1!=0) 
            all++;
    }
    cout<<all;
} 

2024/4/26 22:47
加载中...