B. Subsecuencia más socialmente distanciada (pensamiento + simulación)

B. Subsecuencia más socialmente distanciada

Pregunta:
Da una matriz aaa , encuentra una subsecuenciassen la matrizs (la longitud esxxx ) , 满足 “∑ yo = 1 x ∣ s [i] - s [i - 1] ∣ \ sum_ {i = 1} ^ x | s [i] -s [i-1] |i = 1xs [ i ]-s [ i-1 ] | . Máximo "Si hay más de una respuesta mientexxx subsecuencia más pequeña

Idea:
Observamos una secuencia creciente s = {1, 2, 3, 4, 6} s = \ {1, 2, 3, 4, 6 \}s={ 1 2 3 4 6 }, 则 :
∑ i = 1 x ∣ s [i] - s [i - 1] ∣ = 5 \ sum_ {i = 1} ^ x | s [i] -s [i-1] | = 5i = 1xs [ i ]-s [ i-1 ] =5, 因为s [i]> s [i - 1] s [i]> s [i-1]s [ i ]>s [ i-1 ] , entonces cuando desensamblamos la fórmula, encontramos que solos [5] - s [1] = 6 - 1 = 5 s [5] -s [1] = 6-1 = 5s [ 5 ]-s [ 1 ]=6-1=5. De manera similar, cuando la secuencia es decreciente, se puede obtener la misma conclusión. (Resuelto el problema más corto).
Inserte la descripción de la imagen aquí
Secuencia{x, z, y} \ {x, z, y \}{ x ,con ,y } , si está en la recta numéricazzzx , yx , yentre x y y (comoz 1 z_1con1) ,∣ y - z ∣ + ∣ z - x ∣ = y - x | yz | + | zx | = yxy-z +z-x =y-x si es comoz 2 z_2con2De la misma manera, podemos encontrar ∣ y - z ∣ + ∣ z - x ∣ = z - y + z - x | yz | + | zx | = z-y + zxy-z +z-x =con-y+con-x , esto encuentra∑ i = 1 x ∣ s [i] - s [i - 1] ∣ \ sum_ {i = 1} ^ x | s [i] -s [i-1] |i = 1xs [ i ]-s [ i-1 ] | mayor yxxLos métodos utilizados para minimizar x son los mismos.

El resto es nuestra simulación, para descubrir la secuencia continua creciente o decreciente en la matriz a, y eliminar el elemento del medio sin afectar el resultado.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
const int inf = 0x7ffffff;
const ll INF  = 0x7fffffffffff;
ll f[][2] = {
    
    1, 0, 0, 1, -1, 0, 0, -1}, n, m;
ll s[N];
int read() {
    
    
    int x = 0; int f = 1; char s = getchar();
    while(s < '0' || s > '9') {
    
    if(s == '-') f = -1; s = getchar();}
    while(s >= '0' && s <= '9') {
    
    x = (x << 3) + (x << 1) + s - 48; s = getchar();}
    return x * f;
}
int main() {
    
    
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    int t;
    cin >> t;
    while(t--) {
    
    
        n = read();
        m = n;
        for(int i=1; i<=n; i++) s[i] = read();
        if(n == 2) {
    
    
            cout << 2 << endl;
            for(int i=1; i<=n; i++) cout << s[i] << ' ';
            cout << endl; 
            continue;
        }
        int i = 1, j = 2, k = 3;//从数组下标1,2,3开始扫描,每三个三个比较。
        while(k <= n) {
    
    
        	//判断是否连续递增或
            if(s[j]>s[i] && s[k]>s[j] || s[j]<s[i] && s[j]>s[k]) {
    
    
                m--;
                s[j] = -1;/做标记。
                j++, k++;
            }
            else i = j, j++, k++;
        }
        cout << m << endl;
        for(int i=1; i<=n; i++) {
    
    
            if(s[i] != -1) cout << s[i] << ' ';
        }
        cout << endl;
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45363113/article/details/107436931
Recomendado
Clasificación