正确性证明
查看原帖
正确性证明
602140
Legsi楼主2023/10/19 19:26
这是我的AC代码,就是从中间人分成两组,一个向左,一个向右,以中间人开始,求解最长下降序列
```cpp

#include<bits/stdc++.h>
using namespace std;
int n,a[102],b1[102],b2[102],c1,c2,bm=2;
int main(){
  //  freopen("chorus.in","r",stdin); 
//    freopen("chorus.out","w",stdout);       
    cin>>n;
    for (int i = 1; i <= n; i++)     cin>>a[i];
    for (int i = 1; i <= n; i++){
        int mid=i;
        memset(b1,0,sizeof(b1));
        memset(b2,0,sizeof(b2));
        c1=0;
        c2=0;
        b1[0]=114514;
        b2[0]=114514;
        for(int j=mid;j>=1;j--){
          //  cout<<"az"<<a[j]<<endl;
            if(a[j]<b1[c1]){
                b1[++c1]=a[j];
                
            }
            else if(a[j]!=b1[c1]){
                
                
              //  bool ha=0;
                for(int k=1;k<=c1;k++)
                    if(a[j]>=b1[k]){
                        b1[k]=a[j];
                        break;
             //           ha=1;
                    }
              //  if(ha==0)   b1[0]=a[j];
            }
        }
        for(int j=mid;j<=n;j++){
           // cout<<"pay"<<a[j]<<' '<<b2[c2]<<endl;
            if(a[j]<b2[c2])      b2[++c2]=a[j];//cout<<"once"<<b2[c2]<<"aaa"<<c2<<endl;
            else if(a[j]!=b2[c2]){
               // bool ha=0;
                //cout<<"woc"<<a[j]<<' '<<b2[c2]<<endl;
                for(int k=1;k<=c2;k++)
                    if(a[j]>=b2[k] ){
                        b2[k]=a[j];
                        break;
                    //    ha=1;
                    }
            ///    if(ha==0)   b2[0]=a[j];
            }
        //     for(int i=1;i<=c2;i++)
    //	cout<<b2[i]<<' ';
    //	cout<<"         "<<c2;
    //	cout<<endl;
        }
      //  cout<<endl;
      //  cout<<endl;
       // cout<<i<<endl;
      /*for(int k=1;k<=c1;k++)
            cout<<b1[k]<<' ';
        cout<<endl;
        for(int k=1;k<=c2;k++)
            cout<<b2[k]<<' ';     
        cout<<endl;   */  
        bm=max(bm,c1+c2-1);
   //     cout<<c1<<' '<<c2<<endl;
       // cout<<endl;
       // cout<<endl;
    }
    
    cout<<n-bm<<endl;
    return 0;
}

13 176 164 166 189 178 230 150 134 135 222 162 230 229 176 1 176 164 2 176 166 2 189 166 2 189 178 2 230 178 2 230 178 150 3 230 178 150 134 4 230 178 150 135 4 230 222 150 135 4 230 222 162 135 4 230 222 162 135 4 230 229 162 135 4 9


这是当以第一个人为中间人时的序列变化,我认为应该在if(a[j]>=b2[k] )和if(a[j]>=b1[k])的判断条件里加上and k!=1,因为作为中间人是一定要有的,但只有70分,去掉后就AC了,虽然按照程序输出的模拟并不符合题意,因为序列第一个数已经比中间人大了,所以正确性证明该如何证明呢
2023/10/19 19:26
加载中...