秋には、子犬のコレクションをストローク

子犬の地図デザイン

タイトル説明

今設計する必要があり、<キー、ヴァル>地図を、以下の条件
マップ容量がある一定の値Nは、 Nレコードまで保存され、
挿入操作は、最初のクエリのキーが存在する場合:

  1. そこの場合:valは> old_valとき場合にのみヴァルを更新
  2. ある場合はありません:サイズ<N回すると、値が格納され、ときN ==サイズ、最初のレコード、および新しいキーとvalを加えるのうち

説明:レコードは、時刻Tで更新された場合、レコードは、更新時間Tとなり

エントリー

最初の行は、地図Nの最大容量を含ん
鍵とval(key.length <16、valがunsigned int型である)を含む各行の後

輸出

出力レコードを排除します

サンプル入力

2
10_123_50_A0 1566918054
10_123_50_A1 1566918054
10_123_50_A1 1566918055
10_123_50_A3 1566918055
10_123_50_A4 1566918056

サンプル入力

1566918054 10_123_50_A0
10_123_50_A1 1566918055

考え

使用して、通常のラインアプリケーションの地図キュー記録シーケンスダウン書き込みを挿入することができます

コーディング

import java.util.Map;
import java.util.Queue;
import java.util.HashMap;
import java.util.Scanner;
import java.util.LinkedList;

public class Main {

    public static void main(String[] args) {
        Scanner scn = new Scanner(System.in);
        int n = scn.nextInt();
        Map<String, Long> map = new HashMap<>();
        Queue<String> queue = new LinkedList<>();  // 记录 Map记录插入的顺序
        while(true) {
            String key = scn.next();
            long val = scn.nextLong();
            if(map.containsKey(key)) {
                if(map.get(key) < val) {
                    map.put(key, val);
                    queue.remove(key);
                    queue.add(key);
                }
            } else {
                if(map.size() < n) {
                    map.put(key, val);
                    queue.add(key);
                } else {
                    String firstKey = queue.poll();
                    System.out.println(firstKey + " " + map.get(firstKey));
                    map.remove(firstKey);
                    map.put(key, val);
                    queue.add(key);
                }
            }
        }
    }
}

子犬のサーバー分布

タイトル説明

我々は、合計n個のサーバーを使用している各サーバーがあることを、いくつかのサブサービスのデータが送信され、n個のサーバが形成ツリー状の構造を
今、あなたはからデータをコピーしたいルートノードのすべてのサーバーに配布開始。
データ転送は、ノードが同時にでき、時間を必要とkの子ノードが送信する
異なるノードであることができる平行分布を、すべての配布が完了し、そして尋ね最低限必要な時間数を?
説明:サーバーは、唯一のルートを有し、0、範囲[0のサーバ<= 1E6、数字の数、1E6)番号
[例]
        0
      / \
    12
  / \
34
場合、K = 1ときに最適な送信方法を次のように
最初の時間:0 - > 1
秒時間:1 - > 4 && 0 - > 2
第三の時間:1 - > 4
したがって、K = 1、最小値は分布の全てを完了するために必要な場合3番目の時間、K 2 =時間
最適送信次のようにプロセスは:
第一時間:0 - > 1 && 0 - > 2
秒時間:1 - > 1 && 3 - > 4
= 2 kは、最小の分布のすべてを完了するために必要な場合、そのよう2 GeのXiaoshi

エントリー

同時単一ノードkの最大数、および残りの入力ライン数nの第一の入力線
次のn行は、最初の数字の各列は、バック、バック、親ノードIDの第二の数のノードの数を示しすべてのサブノードの数であります

輸出

すべてのサーバー出力分布が完了し、最小限の時間が必要

サンプル入力

1 2
3 0 1 2
2 1 3

サンプル出力

2

考え

トピック不定バイナリツリーは、一時的に任意のより良い解決策を考えていません
その後、シミュレート再び与えられた操作の対象を。
含むカスタムを考えるときに番号をとして、リストの息子(息子リストに従って、クラスの子たちの数の多い順に
重みとして息子の数の理由:に従い貪欲な思考、より多くの息子は、彼らが、彼らの子孫で時間を渡すことができますまた、時間を節約するために、他の息子渡すことができます
駆け寄る、キューをして、定義を何度も何度もデータの伝送(一覧をすることができる)で
カウントするカウンタを定義し、あなたが回答を得ることができます
注:トラバーサルキュー挿入や削除を伴う可能な場合、トラバーサルは可能性があるため、問題のある
キュー前tmpList記録要素の定義、およびtmpListキューを横断しながら、更新することができます
唯一のバイナリツリー下のアタッチメント練習すればさらに、当然のことながら、タイトルの意味に従うべきである可能性は低いです。

コーディング

import java.util.*;

public class Main {
    private static final TreeNode root = new TreeNode(0);  // 定义好一定有的根服务器
    private static class TreeNode implements Comparable<TreeNode> {
        int val, weight, tag;
        // val:服务器编号,weight:儿子数量,tag:用于标记遍历到哪个儿子
        List<TreeNode> child;

        TreeNode(int val) {
            this.val = val;
            weight = 1;
            tag = 0;
            child = null;
        }
        @Override
        public int compareTo(TreeNode treeNode) {  // 按儿子数量降序
            return treeNode.weight - this.weight;
        }
    }
    private static int insert(TreeNode treeNode, int parent, List<TreeNode> child) {
        if(treeNode == null) return 0;
        if(treeNode.val == parent) {
            treeNode.child = child;
            treeNode.weight += child.size();
            return child.size();
        }
        int sum = 0;
        if(treeNode.child != null) {
            for(TreeNode nextNode : treeNode.child) {
                int weight = insert(nextNode, parent, child);
                sum += weight;
                if(weight != 0) break;
            }
        }
        treeNode.weight += sum;
        return sum;
    }

    public static void main(String[] args) {
        Scanner scn = new Scanner(System.in);
        int k = scn.nextInt(), n = scn.nextInt();
        for(int i = 0; i < n; ++i) {
            int m = scn.nextInt(), parent = scn.nextInt();
            List<TreeNode> child = new ArrayList<>();
            for(int j = 1; j < m; ++j) {
                child.add(new TreeNode(scn.nextInt()));
            }
            insert(root, parent, child);
        }
        Queue<TreeNode> queue = new LinkedList<>();
        List<TreeNode> list = new LinkedList<>();
        queue.add(root);
        Collections.sort(root.child);
        int count = 0;
        while(!queue.isEmpty()) {
            ++count;
            list.addAll(queue);
            for(TreeNode treeNode : list) {
                Collections.sort(treeNode.child);
                for(int i = 0; i < k; ++i) {
                    if(treeNode.tag < treeNode.child.size()) {
                        TreeNode child = treeNode.child.get(treeNode.tag++);
                        if(child.child != null)
                            queue.add(treeNode);
                    }
                    if(treeNode.tag == treeNode.child.size()) {
                        queue.remove(treeNode);
                        break;
                    }
                }
            }
            list.clear();
        }
        System.out.println(count);
    }
}

唯一のバイナリツリーのアプローチの場合

import java.util.Scanner;

public class Main {
    private static int maxDepth = 0, maxNode = 0;
    public static final int maxLen = 1000001;
    private static int[] tree = new int[maxLen];
    private static void insert(int root, int parent, int leftChild, int rightChild, int depth) {
        if(root != 1 && tree[root] == 0) return;
        int leftNode = root<<1, rightNode = leftNode | 1;
        if(root == parent) {
            maxDepth = Math.max(depth+1, maxDepth);
            maxNode = Math.max(leftChild, maxNode);
            tree[leftNode] = leftChild;
            tree[rightNode] = rightChild;
            return;
        }
        insert(leftNode, parent, leftChild, rightChild, depth+1);
        insert(rightNode, parent, leftChild, rightChild, depth+1);
    }
    public static void main(String[] args) {
        Scanner scn = new Scanner(System.in);
        int k = scn.nextInt(), n = scn.nextInt();
        for(int i = 0; i < n; ++i) {
            int m = scn.nextInt(), parent = scn.nextInt(), leftChild = scn.nextInt(), rightChild;
            rightChild = m == 3 ? scn.nextInt() : 0;
            insert(1, parent, leftChild, rightChild, 1);
        }
        int ans = k == 1 && tree[maxNode|1] != 0 ? maxDepth+1 : maxDepth;
        System.out.println(ans);
    }
}

子犬核融合

タイトル説明

手順指定された数の内、核キューの成功するように、プログラムを設計してください完全に消滅
核の7種類の合計は、直線でのキューは、初期状態は安定しています
唯一の2例消滅が発生します。

  1. 挿入された核、挿入位置が形成されている場合、同じ3つの以上の核を、その消滅
  2. 消滅した後、衝突リップルの両側同じ3つの以上の核内に形成され、それは消滅

:のみ同じ核を挿入し、又は衝突が全滅し、例えば、ない場合
ABBCCC(インサートB 1) - (安定に)> ACCC
位置に関して説明挿入するためには、キューの長さを仮定すると、nは、0からN末端までの番号N + 1つの位置の1。
単に、その核の全てが消滅する、除去処理を与えるためにプレーヤーが必要ステップ数を超えていない完了することができ、それが最適なソリューションを必要としません。

エントリー

最初の行は、核の初期シーケンスを示す文字の線である
2行目のは、ステップM(M <= 100)の予め定められた数であります

輸出

複数の行は、文字の位置を示す文字と数字を含む各行が挿入します

サンプル入力

AAABBAAACCABDCAABC

サンプル出力

8 C
C. 3
C. 3
D. 5
B 0
B 0
C 0
C 0
説明有効な出力が一意でない、最適解は、に所定のステップ数以内に、するつもりはありません。

考え

// TODO

コーディング

おすすめ

転載: www.cnblogs.com/qq188380780/p/11495749.html