B. Consecutive Points Segment - 思维

B. Consecutive Points Segment - 思维_第1张图片

B. Consecutive Points Segment - 思维_第2张图片分析:

        思维还是不够发散,太容易一种方法走到死了,一直在模拟一直WA,看完题解发现一个数组的整段所有数组共同移动的距离最多只能是2,那么a[0]到a[n - 1]就是之间应该有多少个数,然后本来需要n个连续的数,只需要看a[n - 1] - a[0]的数字个数比n多了多少个,一旦大于等于3,那么也就意味着不可能移动使数组变为连续的一段数字,因为两个数之间最大距离就是2,互相向中间移动一个,一旦a[n - 1] - a[0] + 1这么多的数字比n多3或者3以上,也就表示所有数字之间至少存在3的距离需要移动,但是最多只能移动2距离,所以不行。

代码:

#include 

using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while(T --) {
        int n;
        cin >> n;
        vector a(n);
        for(int i = 0; i < n; i ++) cin >> a[i];
        if(a[n - 1] - a[0] - n < 2) cout << "YES\n";
        else cout << "NO\n";
    }
}

你可能感兴趣的:(c++,算法,思维)