Java戦闘6:一連の数値の中で増加するトリプルの中心の数を計算します

Java戦闘6:一連の数値の中で増加するトリプルの中心の数を計算します

第11回ブルーブリッジカップ個人大会6。

書き終えた後、他の人の書いたものを見て、自分の考え方がかなり違うと感じましたが、とても良かったので、別の考えを述べさせていただきます。

元の質問:
[問題の説明]
シーケンスa [1]、a [2]、…、a [n]で、添え字i、j、kが0 <i <j <k <n +1およびa [ i] <a [j] <a [k]の場合、a [i]、a [j]、a [k]は増加するトリプルのセットであり、a [j]は増加するトリプルの中心です。
数のシーケンスが与えられると、シーケンス内の要素の数が増加するトリプルの中心になる可能性があります。
【入力形式】入力
の1行目に整数nが含まれています。
2行目には、n個の整数a [1]、a [2]、…、a [n]が含まれています。隣接する整数はスペースで区切られ、指定された一連の数値を示します。
【出力形式】
出力行には、回答を示す整数が含まれています。
[サンプル入力]
5
1 2 5 3 5
[サンプル出力]
2
[サンプル説明]
a [2]とa [4]はトリプルの中心である可能性があります。
[評価のユースケースのスケールと規則]評価のユースケースの
50%について、2 <= n <= 100、0 <=シーケンス内の数<= 1000。
すべての評価ケースで、2 <= n <= 1000、0 <=シリーズの数<= 10000。


質問を受け取った後、質問の意味を理解する前に長い間それを調べました。
実際、トリプルの増分は3つの数値の増分の組み合わせです。
この質問では、一連のデータを入力して、その方法を確認します。この数のセットから多くの組み合わせを生成し、最終的にこれらの増分を見つけることができます。タプルの中央の数は可能な限り多くすることができます。

たとえば、質問で与えられた1 2 5 3 5の増加するトリプルの中心にはいくつかの要素があり、いくつかの組み合わせがあります:1 2 3; 1 2 5; 1 3 5; 1 5 5; 2 3 5 ; 2 55;ここでは15 5; 2 55;インクリメンタルトリプルを満たしていません。明らかに、中心:2、3、合計2つの可能な状況。

私が考えているのは、最初にこのデータのグループを昇順で並べ替えることです。並べ替えた後、中心である可能な最大の状況と最小の状況を削除します。複数の最小値と複数の最大値もあり、繰り返される最大値と最小値も差し引かれます。その結果、中央で発生する可能性のあるケースの数になります。

コードは次のように表示されます。

import java.util.Scanner;
public class blueSelf_6 {
    
    
    public static void main(String[] args){
    
    
        int[] a;int t;int k;
        Scanner reader=new Scanner(System.in);
        int n=reader.nextInt();
        t=n;
        a=new int[n+1];
        Sort s=new Sort();
        for(int i=1;i<=n;i++){
    
    
            a[i]=reader.nextInt();
        }
        s.getSort(a,n);
        for(int i=2;i<=n;i++){
    
    
            if(s.min==a[i]){
    
    
                t--;
            }
        }
        for(int i=n-1;i>1;i--){
    
    
            if(s.max==a[i]){
    
    
                t--;
            }
        }
        if(a.length==1||a.length==2){
    
    
            t=2;
        }
        System.out.println(t-2);
    }
}
class Sort {
    
    
    int i;int max,min;
    public void getSort(int[] s,int n) {
    
    
        int t;
        for (i = 1; i < n; i++) {
    
    
            for(int j=1;j<n-i;j++){
    
    
                if (s[j] > s[j + 1]) {
    
    
                    t = s[j];
                    s[j] = s[j + 1];
                    s[j + 1] = t;
                }
            }
        }
        max=s[n];
        min=s[1];
    }
}
/*
5
1 2 5 3 5

*/

演算結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_46020391/article/details/112342948