기술나눔

[가을채용돌파] 2024년 가을채용 필기시험-ByteDance 필기시험문제-01-3개국어 문제해결방안(Java/Cpp/Python)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

🍭 大家好这里是키요타카 선배 , 알고리즘을 사랑하는 프로그래머

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

✨ 이 시리즈는 계속 업데이트 예정입니다 Qiuzhao 필기 시험 문제
👏 感谢大家的订阅➕ 和 喜欢💗


📧 清隆这边最近正在收集近一年半互联网笔试题汇总,有需要的小伙伴可以关注 기사 끝 프린세스 크루즈 타세요~

여기에 이미지 설명을 삽입하세요.

🎀 01.A先生的环形花圃

질문 설명

A씨는 원형 화단을 갖고 있는데, 화단은 다음과 같이 나누어져 있다. N 블록 영역. A씨는 당초 화단 내 3곳을 선정해 장미를 심었다.

이제 A씨는 모바일 조작을 이용해 꽃밭을 손에 넣으려고 합니다.균형 잡힌 상태

균형 상태: 장미를 심은 두 영역 사이의 거리는 다음보다 작지 않습니다. kk케이(인접한 지역 사이의 거리는 1 1 1)。

이동 동작: 인접 영역의 상태를 교환합니다. (장미 영역은 빈 영역으로, 빈 영역은 장미 영역으로)

동시에 A씨는 효율성을 크게 중시하는 사람이기 때문에 최소한의 이동 횟수를 활용해 화단이 균형 잡힌 상태에 도달할 수 있기를 바란다.

입력 형식

첫 번째 줄에 양의 정수를 입력하세요. 티티, 문의 건수를 나타냅니다.

다음 티티 줄, 각 줄에는 5개의 양의 정수가 포함됩니다.N kk케이 아 1 아_11 아 2 아_22 아 3 아_33는 각각 화단 면적 수, 필요한 최소 거리 및 3개 장미 면적의 초기 위치를 나타냅니다.

출력 형식

산출 티티 각 라인은 화단을 평형 상태로 만드는 데 필요한 최소 교환 횟수를 나타내는 정수를 출력합니다.평형에 도달하지 못하면 출력 − 1 -1 1

샘플 입력

3
5 1 1 2 3
5 2 1 2 3
6 2 2 3 6
  • 1
  • 2
  • 3
  • 4

샘플 출력

0
-1
1
  • 1
  • 2
  • 3

데이터 범위

1 ≤ t ≤ 1 0 4 1 렉티 렉티 10^41104
1 ≤ n ≤ 1 0 9 1 렉 n 렉 10^91N109
1 ≤ k, a 1, a 2, a 3 ≤ n 1 1/k, a_1, a_2, a_3 1/n1케이,1,2,3N

답변

이 문제는 평형상태를 분석함으로써 해결될 수 있다.

첫째, 필요한 최소 거리가 있는 경우 kk케이 정원 면적을 초과했습니다.N 의 1/3이면 무슨 일이 있어도 조건을 만족할 수 없으며 이때 출력은 − 1 -1 1

그렇지 않으면 먼저 세 개의 장미 영역의 위치를 ​​정렬한 다음 인접한 장미 영역 사이의 거리를 계산할 수 있습니다.다음으로, 각 거리에 대해 다음보다 작은 경우 kk케이, 이동 작업이 필요하며 이동 횟수는 kk케이 이 거리의 차이.

마지막으로 모든 거리가 요구 사항을 충족하면 화단이 균형 잡힌 상태에 도달하고 총 이동 횟수가 출력될 수 있습니다.

시간복잡도는 O ( t 로그 ⁡ t ) O( t 로그 t )영형(봐라g), 공간 복잡도는 오(1)오(1)영형(1)

참조 코드

  • 파이썬
t = int(input())

for _ in range(t):
    n, k, *a = map(int, input().split())
    a.sort()

    if k * 3 > n:
        print(-1)
        continue

    b = [a[1] - a[0], a[2] - a[1], n - a[2] + a[0]]
    ans = sum(max(0, k - d) for d in b)

    print(ans)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 자바
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();

        while (t-- > 0) {
            int n = sc.nextInt();
            int k = sc.nextInt();
            int[] a = new int[3];
            for (int i = 0; i < 3; i++) {
                a[i] = sc.nextInt();
            }

            Arrays.sort(a);

            if (k * 3 > n) {
                System.out.println(-1);
                continue;
            }

            int[] b = {a[1] - a[0], a[2] - a[1], n - a[2] + a[0]};
            int ans = 0;
            for (int d : b) {
                ans += Math.max(0, k - d);
            }

            System.out.println(ans);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 씨피피
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int t;
    cin >> t;

    while (t--) {
        int n, k, a[3];
        cin >> n >> k >> a[0] >> a[1] >> a[2];

        sort(a, a + 3);

        if (k * 3 > n) {
            cout << -1 << endl;
            continue;
        }

        int b[] = {a[1] - a[0], a[2] - a[1], n - a[2] + a[0]};
        int ans = 0;
        for (int d : b) {
            ans += max(0, k - d);
        }

        cout << ans << endl;
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

🪐 02.卢小姐的音游金币

문제 설명

루 씨는 최근 피아노 소리에 초점을 맞춘 음악 게임에 중독되었습니다.게임에서 각 피아노 타일에는 숫자가 있으며, 최소 숫자는 다음과 같습니다. 1 1 1 . 연속해서 숫자가 증가하는 5개의 피아노 타일을 치면 금화를 얻게 됩니다.

예를 들어, Miss Lu가 숫자를 쳤다면 1, 2, 3, 4, 5, 6 피아노 곡, 그 다음에는1, 2, 3, 4, 5 숫자가 연속적으로 증가하는 이 5개의 블록에 대해 그녀는 금화를 받게 됩니다.

장기간 레벨을 진행하면 숫자가 재설정됩니다. 1 1 1 시작. 따라서 한 레벨에서는 숫자는 같지만 숫자가 다른 여러 피아노 타일을 칠 수 있습니다.

같은 레벨에서 숫자가 계속 증가하는 피아노 타일 5개만 있으면 금화를 얻을 수 있습니다.

루 선생님의 뛰어난 힘으로 인해 그녀는 4단계를 통과했습니다.Miss Lu에게는 이제 4가지 난이도가 주어집니다. 금주 모임 비비 참조 그리고 디.디. 피아노 타일에 닿은 횟수 루 씨는 이 4개 레벨에서 총 몇 개의 금화를 얻을 수 있나요?

입력 형식

첫 번째 줄에는 양의 정수가 포함되어 있습니다. N 1 ≤ n ≤ 1 0 5 1 렉 n 렉 10^51N105)는 Miss Lu가 4개 레벨에서 친 피아노 타일의 총 개수를 나타냅니다.

다음 N 행의 경우 각 행에 세 개의 매개변수를 입력합니다. 아이 아이_아이 비 비_이 1 ≤ ai, bi ≤ 1 0 9 1 1/2 a_i, b_i 1/2 10^91,109)그리고 씨 씨_이 {'A', 'B', 'C', 'D'}에 있는 c_i{,,,})는 각각 각 피아노 타일의 수, 수량 및 레벨을 나타냅니다.

출력 형식

미스 루가 얻을 수 있는 금화의 총 개수를 나타내는 정수를 출력하세요.

샘플 입력

11
1 1 A
2 2 A
3 2 A
4 2 A
5 2 A
6 1 A
7 1 B
8 2 B
9 2 B
10 2 B
11 1 B
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

샘플 출력

3
  • 1

샘플 설명

레벨의 경우 금주 모임,첫 번째 1, 2, 3, 4, 5 금화를 얻을 수 있고,2, 3, 4, 5, 6 또 다른 금화를 얻을 수 있습니다.

레벨의 경우 비비7, 8, 9, 10, 11 금화를 얻을 수 있습니다.

따라서 총 3 3 3 금화.

샘플 입력 2

5
1 1 C
2 2 C
3 2 C 
4 2 C
6 1 C
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

샘플 출력 2

0
  • 1

샘플 설명 2

수준에서 참조 에서는 5개의 연속 증가하는 숫자를 얻을 수 없으므로 금화의 개수는 0 0 0

데이터 범위

  • 1 ≤ n ≤ 1 0 5 1 렉 n 렉 10^51N105
  • 1 ≤ ai, bi ≤ 1 0 9 1 1/2 a_i, b_i 1/2 10^91,109
  • {'A', 'B', 'C', 'D'}에 있는 c_i{,,,}

답변

이 문제는 해시 테이블과 정렬을 사용하여 해결할 수 있습니다. 구체적인 아이디어는 다음과 같습니다.

  1. 해시 테이블 사용 cnt 각 레벨에서 각 숫자가 나타나는 횟수를 기록하십시오. 키는 레벨 캐릭터와 숫자의 조합이고, 값은 레벨에 숫자가 나타나는 횟수입니다.

  2. 동일한 레벨의 숫자가 연속되도록 레벨 문자 및 숫자에 따라 입력 데이터를 정렬합니다.

  3. 정렬된 데이터를 탐색하고 각 숫자에 대해 5개의 연속 숫자가 모두 현재 수준에 존재하는지 확인합니다. 존재하는 경우, 이 5개 숫자 중 발생 횟수의 최소값을 취하여 답에 세고, 이 5개 숫자의 발생 횟수에서 최소값을 뺍니다.

  4. 최종 답은 조건을 만족하는 모든 금화의 합입니다.

시간복잡도는 O(n log ⁡ n) O(n log n)영형(N봐라gN), 공간 복잡도는 O(n) O(n)영형(N)

참조 코드

  • 파이썬
from collections import defaultdict
import sys

def solve():
    n = int(input())
    cnt = defaultdict(int)
    vec = []

    for _ in range(n):
        a, b, c = input().split()
        a, b = int(a), int(b)
        cnt[c + str(a)] += b
        vec.append((c, a))

    vec.sort()

    ans = 0
    for v in vec:
        arr = [v[0] + str(v[1] + i) for i in range(5)]
        t = min(cnt[a] for a in arr)
        ans += t
        for a in arr:
            cnt[a] -= t

    print(ans)

if __name__ == '__main__':
    solve()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 자바
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        Map<String, Integer> cnt = new HashMap<>();
        List<int[]> vec = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            String[] input = br.readLine().split(" ");
            int a = Integer.parseInt(input[0]);
            int b = Integer.parseInt(input[1]);
            String c = input[2];
            String key = c + a;
            cnt.put(key, cnt.getOrDefault(key, 0) + b);
            vec.add(new int[]{c.charAt(0), a});
        }

        vec.sort((x, y) -> {
            if (x[0] != y[0]) {
                return x[0] - y[0];
            }
            return x[1] - y[1];
        });

        long ans = 0;
        for (int[] v : vec) {
            String[] arr = new String[5];
            for (int i = 0; i < 5; i++) {
                arr[i] = (char) v[0] + String.valueOf(v[1] + i);
            }
            int t = Integer.MAX_VALUE;
            for (String a : arr) {
                t = Math.min(t, cnt.getOrDefault(a, 0));
            }
            ans += t;
            for (String a : arr) {
                cnt.put(a, cnt.get(a) - t);
            }
        }

        System.out.println(ans);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 씨피피
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <climits>
using namespace std;

using ll = long long;

int main() {
    int n;
    cin >> n;
    map<string, ll> cnt;
    vector<pair<string, int>> vec;

    for (int i = 1; i <= n; i++) {
        int a, b;
        string c;
        cin >> a >> b >> c;
        cnt[c + to_string(a)] += b;
        vec.push_back({c, a});
    }

    sort(vec.begin(), vec.end());

    ll ans = 0;
    for (auto& v : vec) {
        vector<string> arr;
        for (int i = 0; i < 5; i++) {
            arr.push_back(v.first + to_string(v.second + i));
        }
        ll t = LLONG_MAX;
        for (auto& a : arr) {
            t = min(t, cnt[a]);
        }
        ans += t;
        for (auto& a : arr) {
            cnt[a] -= t;
        }
    }

    cout << ans << endl;

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

✨ 03. 미스루의 독특한 정원

문제 설명

Miss Lu의 길이는 다음과 같습니다. N 식물이 심어진 정원에서N 다양한 꽃을 심으세요.모든 꽃에는 아름다움의 가치가 있습니다 아이 아이_아이

Lu 씨는 아름다운 정원은 독특해야 한다고 생각합니다. n − 1 n-1N1 심은 꽃의 아름다움의 가치는 동일하지만 1 1 1 심은 꽃의 아름다움의 가치는 다른 꽃과 다릅니다.

각 작업마다 루 선생님은 꽃을 선택하고 그 아름다움의 가치를 높일 수 있습니다. 1 1 1 또는 마이너스 1 1 1

이제 Lu 씨는 정원을 독특하게 만들기 위해 얼마나 많은 작업이 필요한지 알고 싶어합니다.

입력 형식

첫 번째 줄에는 양의 정수가 포함되어 있습니다. N, 정원의 길이를 나타냅니다.

두 번째 줄에는 다음이 포함됩니다. N 양의 정수 a 1 , a 2 , … , a_1, a_2, ldots, a_n1,2,,N, 각 꽃의 아름다움 가치를 나타냅니다.

출력 형식

정원을 고유하게 만드는 데 필요한 최소 작업 수를 나타내는 정수를 출력합니다.

샘플 입력

4
1 2 3 4
  • 1
  • 2

샘플 출력

2
  • 1

데이터 범위

  • 1 ≤ n ≤ 1 0 5 1 렉 n 렉 10^51N105
  • 1 ≤ ai ≤ 1 0 9 1 렉 a_i 렉 10^91109

답변

최적의 해법은 중앙값이 되어 중앙값이 되기 위한 모든 비용을 열거하는 것입니다.

시간복잡도는 O(n log ⁡ n) O(n log n)영형(N봐라gN), 공간 복잡도는 O(n) O(n)영형(N)

참조 코드

  • 파이썬
def main():
    n = int(input())
    w = list(map(int, input().split()))
    w.sort()
    if w[0] == w[n - 1]:
        print("1")
        return
    s1, s2 = 0, 0
    m1, m2 = w[(n - 1) // 2], w[(n + 1) // 2]
    for i in range(n - 1):
        s1 += abs(m1 - w[i])
    for i in range(1, n):
        s2 += abs(m2 - w[i])
    print(min(s1, s2))

if __name__ == "__main__":
    main()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 자바
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] w = new int[n];
        for (int i = 0; i < n; i++)
            w[i] = scanner.nextInt();
        Arrays.sort(w);
        if (w[0] == w[n - 1]) {
            System.out.println("1");
            return;
        }
        long s1 = 0, s2 = 0;
        int m1 = w[(n - 1) / 2], m2 = w[(n + 1) / 2];
        for (int i = 0; i < n - 1; i++)
            s1 += Math.abs(m1 - w[i]);
        for (int i = 1; i < n; i++)
            s2 += Math.abs(m2 - w[i]);
        System.out.println(Math.min(s1, s2));
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 씨피피
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int N = 100010;

int main() {
    int n, w[N];
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> w[i];
    sort(w, w + n);
    if (w[0] == w[n - 1]) {
        cout << "1" << endl;
        return 0;
    }
    ll s1 = 0, s2 = 0;
    int m1 = w[(n - 1) / 2], m2 = w[(n + 1) / 2];
    for (int i = 0; i < n - 1; i++)
        s1 += abs(m1 - w[i]);
    for (int i = 1; i < n; i++)
        s2 += abs(m2 - w[i]);
    cout << min(s1, s2) << endl;
    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

🥝 04.LYA的字符画

질문 설명

LYA는 최근 캐릭터 페인팅에 푹 빠졌습니다. 그녀는 캐릭터 그림의 아름다움은 캐릭터 그림에 연속된 동일한 기호의 수와 같다고 믿습니다.예를 들어, 캐릭터 그림 "aabbccddef"의 미학은 다음과 같습니다. 6 6 6

LYA의 친구가 그녀에게 0 0 0 그리고 1 1 1 캐릭터 그리기에 푹 빠진 LYA는 이 끈으로 이루어진 모든 끈을 알고 싶어 합니다.하위 문자열미학의 총합은 무엇입니까?

참고: 있습니다. Cn + 1 2 C^{2}_{n+1}N+12 하위 문자열.

입력 형식

첫 번째 줄에 양의 정수를 입력하세요. N, 문자열의 길이를 나타냅니다.

두 번째 줄의 길이는 N ~의 01 01 01 끈.

출력 형식

모든 하위 문자열의 미학의 합을 나타내는 정수를 출력합니다.

샘플 입력

4
0011
  • 1
  • 2

샘플 출력

14
  • 1

데이터 범위

1 ≤ n ≤ 2 × 1 0 5 1 leq n leq 2 곱하기 10^51N2×105

답변

이 문제는 접두사 합이라는 아이디어를 통해 해결될 수 있습니다.

먼저, 문자열의 전체 하위 문자열 수를 계산할 수 있습니다. n ( n + 1 ) 2 분수 {n ( n + 1 )}{2}2N(N+1)

그런 다음 문자열을 반복하고 변수를 사용합니다. 나는 현재 연속된 동일 기호의 시작 위치를 기록, 변수 르르르아르 자형 현재 위치를 기록합니다.언제 s [ r ] ≠ s [ r − 1 ] s[r] neq s[r-1]에스[아르 자형]=에스[아르 자형1] 이면 새로운 기호가 나타나는 것을 의미하며 다음을 계산할 수 있습니다. [ l , r ) [ l , r )[,아르 자형) 간격의 하위 문자열 수, 즉 ( r − l ) ( r − l + 1 ) 2 프랙{(rl)(r-l+1)}{2}2(아르 자형)(아르 자형+1), 전체 하위 문자열 수에서 이를 뺍니다.

마지막으로 남은 것은 출력할 수 있는 모든 아름다운 하위 문자열의 수입니다.

시간 복잡도 O(n) O(n)영형(N), 공간 복잡도 오(1)오(1)영형(1)

참조 코드

  • 파이썬
def cal(length):
    return length * (length + 1) // 2

n = int(input())
s = input() + '#'

ans = 0
total = cal(n)
l = 0
for r in range(1, n + 1):
    if s[r] != s[r - 1]:
        ans += total - cal(l) - cal(n - r)
        l = r

print(ans)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 자바
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String s = sc.next() + "#";
        
        long ans = 0;
        long total = cal(n);
        int l = 0;
        for (int r = 1; r <= n; r++) {
            if (s.charAt(r) != s.charAt(r - 1)) {
                ans += total - cal(l) - cal(n - r);
                l = r;
            }
        }
        System.out.println(ans);
    }
    
    private static long cal(int len) {
        return (long) len * (len + 1) / 2;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 씨피피
#include <iostream>
#include <string>

using namespace std;

using ll = long long;

ll cal(int len) {
    return (ll) len * (len + 1) / 2;
}

int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    s += "#";
    
    ll ans = 0;
    ll total = cal(n);
    int l = 0;
    for (int r = 1; r <= n; r++) {
        if (s[r] != s[r - 1]) {
            ans += total - cal(l) - cal(n - r);
            l = r;
        }
    }
    cout << ans << endl;
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

🌸 05.卢小姐的数组删除计划

질문 이름

문제 설명

Miss Lu는 매우 원대한 계획을 가지고 있습니다. 그녀는 세상의 모든 어레이를 삭제하고 싶어합니다! 그러나 그녀의 능력은 제한되어 있습니다. 매번 배열에서 동일한 요소 두 개만 선택하고 그 사이의 모든 요소(두 요소 자체 포함)를 삭제할 수 있습니다.

이제 Miss Lu 앞에는 N 의 배열 아아, 그녀는 이 배열에서 최대 몇 개의 요소를 삭제할 수 있는지 알고 싶어합니다.

입력 형식

첫 번째 줄에는 양의 정수가 포함되어 있습니다. N, 배열을 나타냅니다 아아 길이.

두 번째 줄에는 다음이 포함됩니다. N 공백으로 구분된 양의 정수 a 1 , a 2 , … , a_1, a_2, ldots, a_n1,2,,N, 배열을 나타냅니다 아아 강요.

출력 형식

Miss Lu가 삭제할 수 있는 최대 요소 수를 나타내는 정수를 출력합니다.

샘플 입력

4
1 2 1 2
  • 1
  • 2

샘플 출력

1
  • 1

데이터 범위

  • 1 ≤ n ≤ 2 × 1 0 5 1 leq n leq 2 곱하기 10^51N2×105
  • 1 ≤ ai ≤ 1 0 9 1 렉 a_i 렉 10^91109

답변

이 문제는 정렬과 이중 포인터 아이디어를 사용하여 해결할 수 있습니다.

먼저 배열을 변환할 수 있습니다. 아아 의 요소는 값을 기준으로 정렬되고 배열에 있는 각 요소의 원래 위치가 기록됩니다. 이것의 목적은 동일한 요소의 위치 범위를 쉽게 찾는 것입니다.

다음으로, 정렬된 배열을 반복하고 각 요소에 대해 동일한 값을 갖는 모든 요소의 위치 범위를 찾을 수 있습니다. [좌,우] [좌,우][,아르 자형] . 이 범위의 요소는 원래 배열의 동일한 두 요소 사이에 있으므로 삭제할 수 있습니다.범위를 계산할 수 있습니다. [좌,우] [좌,우][,아르 자형] 의 요소 수 R − L − 1 R - L - 1아르 자형1, 현재 삭제된 요소의 최대 개수와 비교하여 최대값을 업데이트합니다.

마지막으로 삭제된 요소의 최대 개수를 출력합니다.

시간복잡도는 O(n log ⁡ n) O(n log n)영형(N봐라gN) , 주로 정렬의 시간 복잡도입니다.공간 복잡도는 O(n) O(n)영형(N), 요소의 원래 위치를 저장하는 데 사용됩니다.

참조 코드

  • 파이썬
n = int(input())
a = list(map(int, input().split()))

idx = sorted(range(n), key=lambda x: a[x])

ans = 0
i = 0
while i < n:
    j = i
    L, R = n, -1
    while j < n and a[idx[j]] == a[idx[i]]:
        L = min(L, idx[j])
        R = max(R, idx[j])
        j += 1
    ans = max(ans, R - L - 1)
    i = j

print(ans)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 자바
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        Integer[] idx = new Integer[n];

        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
            idx[i] = i;
        }

        Arrays.sort(idx, Comparator.comparingInt(i -> a[i]));

        int ans = 0;
        for (int i = 0; i < n;) {
            int j = i;
            int L = n, R = -1;
            while (j < n && a[idx[j]] == a[idx[i]]) {
                L = Math.min(L, idx[j]);
                R = Math.max(R, idx[j]);
                j++;
            }
            ans = Math.max(ans, R - L - 1);
            i = j;
        }

        System.out.println(ans);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 씨피피
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    vector<int> idx(n);

    for (int i = 0; i < n; i++) {
        cin >> a[i];
        idx[i] = i;
    }

    sort(idx.begin(), idx.end(), [&](int i, int j) {
        return a[i] < a[j];
    });

    int ans = 0;
    for (int i = 0; i < n;) {
        int j = i;
        int L = n, R = -1;
        while (j < n && a[idx[j]] == a[idx[i]]) {
            L = min(L, idx[j]);
            R = max(R, idx[j]);
            j++;
        }
        ans = max(ans, R - L - 1);
        i = j;
    }

    cout << ans << endl;

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

마지막에 쓰세요

여기에서는 선배의 가을 모집 동반자 체크인 캐빈을 추천하고 싶습니다. 매일 31 일 동안 일반적인 인터넷 필기 시험 문제를 풀 수 있도록 단계별로 안내해 드리겠습니다.

🎧 秋招陪伴刷题打卡

  • 시험 읽기:

[가을 모집 체크인] Day01-맞춤정렬-CSDN 블로그

[가을 모집 체크인] Day02 - 최강 2부 시리즈 - 바이너리 검색 - CSDN 블로그

[가을 모집 체크인] Day03 - 최강의 2점 시리즈 - 2점 정답 ​​- CSDN 블로그

우리는 이전 주요 제조업체의 실제 질문에 대한 온라인 리뷰를 제공합니다. 관심 있는 친구는 Qinglong에 비공개 메시지를 보내 자세히 알아볼 수 있습니다.

여기에 이미지 설명을 삽입하세요.

여기에 이미지 설명을 삽입하세요.

그리고 더! 게다가!

✈️ 필기 시험 문제의 종합 요약

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.