「Codeforces」B. Vermeiden Sie lokale Maxima

B. Lokale Maxima vermeiden

https://codeforces.com/contest/1635/problem/B

Themenbeschreibung

Sie haben ein Array, jedes Element im Array ist ein ganzzahliger Wert ( 1 ≤ ai ≤ 1 0 9 1\leq a_i \leq 10^91Aich1 09 ), können Sie das Array mehrmals bearbeiten, wobei Sie für jede Operation eine Größe von1 ≤ x ≤ 1 0 9 1 \leq x \leq10^91X1 0Jede Zahl zwischen 9 ersetzt ai a_iAich

Suchen: Verwenden Sie die geringste Anzahl von Operationen, damit das Array keine lokalen Maximalwerte enthält.

Lokales Maximum: wenn ai a_iAichgrößer als die beiden benachbarten Elemente ist, handelt es sich um ein lokales Maximum.

Beschreibung eingeben

Jeder Test enthält mehrere Testfälle. Die erste Zeile enthält eine Ganzzahl t (1≤t≤10000) – die Anzahl der Testfälle. Dann gibt es t Testfälle.

Die erste Zeile jedes Testfalls enthält eine ganze Zahl n (2≤n≤2⋅105) – die Größe des Arrays a.

Die zweite Zeile jedes Testfalls enthält n ganze Zahlen a1, a2, ..., an (1≤ai≤109), Elemente des Arrays.

Stellen Sie sicher, dass die Summe von n aller Testfälle 2⋅105 nicht überschreitet.

Ausgangsbeschreibung

Geben Sie für jeden Testfall zuerst eine Zeile aus, die eine einzelne Ganzzahl m enthält - die minimal erforderliche Anzahl von Operationen. Geben Sie dann eine Zeile aus, die aus n ganzen Zahlen besteht - das resultierende Array nach der Operation. Beachten Sie, dass sich dieses Array durch m Elemente vollständig vom ursprünglichen Array unterscheiden sollte.

Wenn es mehrere Antworten gibt, drucken Sie eine aus.

Probe

#1

5
3
2 1 2
4
1 2 3 1
5
1 2 1 2 1
9
1 2 1 3 2 3 1 2 1
9
2 1 3 1 3 1 3 1 3
0
2 1 2
1
1 3 3 1
1
1 2 2 2 1
2
1 2 3 3 2 3 3 2 1
2
2 1 3 3 3 1 1 1 3

Im ersten Beispiel enthält das Array keine lokalen Maxima, sodass wir keine Operation ausführen müssen.

Im zweiten Beispiel können wir a2 auf 3 ändern und das Array hat keine lokalen Maxima.

Hinweis

analysieren

Um ehrlich zu sein, obwohl ich es bestanden habe, scheint es einfach dumm zu sein (egal, ich habe es trotzdem bestanden, hahaha).

 1 2 3 1 // 3 是局部最大值
 1 3 3 1 // 更新前面的 2 变成 3
 
 1 2 1 2 1 // 两个 2 都是局部最大值
 1 2 2 2 1 // 修改中间的 1 为 2(执行一次)
 1 1 1 1 1 // 修改两个 2 为 1(执行两次)

Gemäß der Definition des lokalen Maximums können wir wissen, dass, wenn es mehrere lokale Maxima gibt, sie durch mindestens ein Element zwischen ihnen getrennt sein müssen, dann müssen wir dieses Element nur auf der linken und rechten Seite auf das größte ändern. Es ist okay.

AC-Code

import java.util.*;
import java.io.*;

public class Main {
    
    
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st = new StreamTokenizer(br);
    static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));

    public static void main(String[] args) throws Exception {
    
    
        int T = nextInt();
        while(T-- != 0) {
    
    
            int n = nextInt();
            int[] A = new int[n];
            boolean[] vis = new boolean[n];
            for(int i = 0; i < n; i++) A[i] = nextInt();
            for(int i = 1; i < n - 1; i++) {
    
     // 筛选局部最大值
                if(A[i] > A[i-1] && A[i] > A[i+1]) {
    
    
                    vis[i] = true;
                }
            }
            int total = 0; // 统计执行次数
            for(int i = 1; i < n - 1; i++) {
    
     // 修改局部最大值
                if(i + 2 < n && vis[i] && vis[i+2]) {
    
     // 若两个局部最大值相隔一格,则修改中间元素
                    total++;
                    A[i + 1] = Math.max(A[i], A[i + 2]);
                    vis[i] = false;
                    vis[i + 2] = false;
                    continue;
                }
                if(vis[i]){
    
     // 单个局部最大值
                    total++;
                    A[i-1] = A[i];
                    vis[i] = false;
                }
            }
            out.println(total);
            for(int i = 0; i < n; i++) out.print(A[i] + " ");
            out.println();
        }
        out.flush();
    }

    public static int nextInt() throws Exception {
    
    
        st.nextToken();
        return (int) st.nval;
    }

    public static String nextStr() throws Exception {
    
    
        st.nextToken();
        return st.sval;
    }
}

おすすめ

転載: blog.csdn.net/qq_43098197/article/details/130481499