C—袋鼠将军的神秘序列

原题: C—袋鼠将军的神秘序列

题目有以下细节:

  1. 输入的元素不能 > n;
  2. 输入的元素中 > 0 的元素出现的次数不能超过 1 次;
  3. 将 > 0 的元素选出来,升序排序,第 1 个元素不能超过 2,即不能是 3 及以上的数;
  4. 排除以上情况,那么我们知道排序完的序列肯定是严格递增的,是公差为 1 的等差数列(首项要么是 1,要么是 2 ),可以允许最多缺少一项,不能缺少两项及以上!

以下样例都是无解:

6
0 0 10 0 0 0
6
0 0 2 2 0 0
6
0 0 3 4 5 0
6
0 1 4 5 6 0  // 差值不能超过 1,记住:是公差为 1 的等差数列!最多只能缺少 1 项!!!
6
0 1 3 4 6 0

完整程序,有点丑

,,ԾㅂԾ,,

void solve(){
   int n;
   cin>>n;
   vector<pair<int,int>> a;
   map<int,int> mp;
   bool sign=1;
   for(int i=1;i<=n;i++){
       int x;
       cin>>x;
       if(x>0)a.emplace_back(x,i),mp[x]++;
       if(x>n)sign=0;
   }
   for(auto [x,y]:mp){
       if(y>=2){
           sign=0;
           break;
       }
   }
   sort(a.begin(),a.end());
   int mex=1,flag=0,idx=-1;
   for(int i=0;i<a.size();i++,mex++){
       if(a[i].first != mex){
           if(a[i].first != mex+1){
               sign=0;
               break;
           }
           mex++;
           if(flag)sign=0;
           flag=1;
       }
       if(flag)idx=a[i].second;
   }
   if(!sign){
       cout<<"-1\n";
       return ;
   }
   
   if(a.size()==1){
       if(a[0].first >= 3){
           cout<<"-1\n";
           return ;
       }
       cout<<a[0].first<<"\n";
       while(a[0].first--){
           cout<<a[0].second<<" ";
       }
       cout<<"\n";
       return ;
   }
   
   if(flag)cout<<a.size()+1<<"\n";
   else cout<<a.size()<<"\n";
   mex=1;
   for(int i=0;i<a.size();i++,mex++){
       if(mex!=a[i].first){
           mex=a[i].first;
           cout<<idx<<" ";
       }
       cout<<a[i].second<<" ";
   }
   cout<<"\n";
}