C. Nastya and Strange Generator (思维,假题)

题目大意:这个题的题目大意不好理解,有n个数,然后向一个数组里填数,首先这个数组arr是空的,有一个R数组和count数组,R[j]的值是从j到n,如果arr[i]为空,i保证最小,那么R[j]=i,如果找不到这样的i,那么R[j]就让他空着。count数组,count[i]表示位置i出现的次数。从1<=t<=n为每个数挑选位置,要求位置count[i]最大,选好后arr[i]=t,注意t从1到n逐渐增大。

题解:这TM绝对是个假的题目,读题20分钟,读完就有了思路,然后就是实现不了,最后才发现真tm水....

先放1,此时的R【】={1,2,3,4,5},count[]={1,1,1,1,1,1}。再放2,如果把1放在3,此时的R【】={1,2,4,4,5},count[]={1,1,0,2,5},那么2一定要放再4这个位置,同理3一定放在5这个位置。如果刚开始我们把1放再5这个位置,R【】={1,2,3,4,x},count[]={1,1,1,1,0},然后2可以随便放。所以我们就可以发现规律了,当把a放在pos时,a+1一定放再pos+1....直到pos>n或者pos这个位置被比它小的数给占用了。

所以我们可以总结为arr[i+1]要么比arr[i]小,要么=arr[i]+1。

code:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int arr[N];
void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    for(int i=2;i<=n;i++) {
        if(arr[i]-arr[i-1]>=2) {
            cout<<"No"<<endl;
            return ;
        }
    }
    cout<<"Yes"<<endl;
}

int main(){
    int t;
    cin>>t;
    while(t--) solve();
    return 0;
}
原文地址:https://www.cnblogs.com/Accepting/p/12765773.html