「コードフォース」B. 奇数スワップソート

B. オッドスワップソート

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

トピックの説明

ai + ai + 1 a_i+a_{i+1}の場合、配列 A があり、この配列をトラバースします。a+ai + 1合計が奇数の場合、これら 2 つの数値の位置を入れ替えますswap ( ai , ai + 1 ) swap(a_i, a_{i+1})s w a p ( aai + 1)結果のシーケンスが非減少シーケンスになるようにします。

説明を入力

最初の行には、テスト ケースの数として示される T (1≤t≤105) が含まれます。

各テスト ケースの最初の行には、配列の長さである整数 n (1≤n≤105) が含まれます。

各テスト ケースの 2 行目には、n 個の整数 a1,a2,…,an (1≤ai≤109) — 配列の要素が含まれます。

出力の説明

減少しないシーケンスですか: はいまたはいいえ

サンプル

#1

4
4
1 6 31 14
2
4 2
5
2 9 6 7 10
3
6 6 6
Yes
No
No
Yes

#2

1
5
2 9 6 2 10
No

ヒント

分析する

このトピックは実際にシミュレートできますが、複雑さはO ( n 2 ) O(n^2)です。O ( n2 )、データ量が多いため、TLE である必要があります。

分析してみましょう、タイトルにはai + ai + 1 a_i + a_{i+1}と書かれていますa+ai + 1合計が奇数の場合にのみ位置を交換できます。その場合、次の情報を知ることができます。

  1. 2 つの数を交換するには、一方が奇数で他方が偶数でなければなりません。なぜなら、この方法でのみ奇数を得ることができるからです。
  2. 偶数でつながれたものと奇数でつながれたものは偶数でなければならないので、位置を入れ替えることはできません。

上記の2番目の情報では、偶数または奇数が接続されている位置を交換することは不可能であるため、最終結果が非減少シーケンスであることが保証される場合、偶数および奇数シーケンスはすべて非減少でなければなりません.

例: [ 1 , 2 , 5 , 4 , 3 , 6 ] [1, 2, 5, 4, 3, 6][ 1 ,2 5 4 3 6 ] は偶数列[2, 4, 6] [2, 4, 6] を[ 2 ,4 6 ]と奇数列[1, 5, 3] [1, 5, 3][ 1 ,5 3 ] の場合、交換がどうであれ、5 と 3 は最終的に避けられないことがわかります。

  • 最初のスワップ: [ 1 , 2 , 4 , 5 , 3 , 6 ] [1, 2, 4, 5, 3, 6][ 1 ,2 4 5 3 6 ] (5+4=9は奇数で、奇数と偶数は入れ替わる)
  • 2 番目のスワップ: [ 1 , 2 , 4 , 5 , 3 , 6 ] [1, 2, 4, 5, 3, 6][ 1 ,2 4 5 3 6 ] (5+3=8 は偶数、2 つの奇数は交換できません)

したがって、偶数列と奇数列が増加しているかどうかを判断するだけで済みます。

ACコード

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+1];
            for(int i = 1; i <= n; i++) A[i] = nextInt();
            int even = 0, odd = 0; // 偶数和奇数
            boolean flag = true; // 默认最终是递增序列
            for(int i = 1; i <= n; i++) {
    
    
                if(A[i] % 2 == 0) {
    
     // 偶数序列
                    if(A[i] >= even) even = A[i]; // 是否递增
                    else {
    
    
                        flag = false;
                        break;
                    }
                } else {
    
     // 奇数序列
                    if(A[i] >= odd) odd = A[i]; // 是否递增
                    else {
    
    
                        flag = false;
                        break;
                    }
                }
            }
            out.println(flag ? "Yes" : "No");
        }
        out.flush();
    }

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

おすすめ

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