私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
🍭 大家好这里是清隆先輩 , アルゴリズムが大好きなプログラマーです。
💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导
✨ このシリーズは今後も更新していく予定です Qiuzhaoの筆記試験の問題
👏 感谢大家的订阅➕ 和 喜欢💗
📧 清隆这边最近正在收集近一年半互联网笔试题汇总,有需要的小伙伴可以关注 記事の終わり プリンセスクルーズに乗ろう〜
Aさんは円形の花壇を持っており、 んんん ブロックエリア。 Aさんは当初、バラを植える花壇のエリアを3つ選択しました。
今、A さんは移動運用を使ってお花畑を届けたいと考えています。バランスの取れた状態。
バランスの取れた状態: バラが植えられている 2 つのエリア間の距離が少なくとも えーっけ(隣接するエリア間の距離は 1 1 1)。
移動操作:隣接するエリアのステータスを交換します(バラエリアが空きエリアになり、空きエリアがバラエリアになります)。
一方で、Aさんは効率を重視する人なので、最小限の手数で花壇のバランスを整えてほしいと考えています。
最初の行に正の整数を入力します ttt、問い合わせの数を示します。
次 ttt 行、各行には 5 つの正の整数が含まれます んんん、 えーっけ、 1 1_11つの1、 2 ...1つの2、 3 a_31つの3、それぞれ花壇エリアの数、必要な最小距離、および 3 つのバラ エリアの初期位置を表します。
出力 ttt 各行は、花壇を平衡状態にするために必要な交換の最小数を表す整数を出力します。平衡に達しない場合は出力 − 1 -1 −1。
3
5 1 1 2 3
5 2 1 2 3
6 2 2 3 6
0
-1
1
1 ≤ t ≤ 1 0 4 1 ≤ t ≤ 10^41≤t≤104
1 ≤ n ≤ 1 0 9 1 ≤ n ≤ 10^91≤ん≤109
1 ≤ k 、a 1 、a 2 、a 3 ≤ n 1 ≤ k、a_1、a_2、a_3 ≤ n1≤け,1つの1,1つの2,1つの3≤ん
この問題は平衡状態を分析することで解決できます。
まず、必要な最小距離の場合 えーっけ ガーデンエリア数を超えました んんん の 3 分の 1 の場合、どのような場合でも条件を満たすことができず、出力は次のようになります。 − 1 -1 −1。
それ以外の場合は、まず 3 つのバラ領域の位置を並べ替えてから、隣接するバラ領域間の距離を計算します。次に、距離ごとに、それが以下の場合は、 えーっけの場合、移動操作が必要となり、移動回数は えーっけ この距離からの違い。
最後に、すべての距離が要件を満たすと、花壇はバランスの取れた状態に達し、合計移動数を出力できるようになります。
時間計算量は O ( t log t ) O(t log t)お(t見よグt)、空間の複雑さは オー(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)
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);
}
}
}
#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 1 1 。数字が増加するピアノタイルを 5 つ連続して叩くと、金貨が得られます。
たとえば、ミス・ルーが番号付きの数字を打った場合、 1, 2, 3, 4, 5, 6
ピアノ曲、その後1, 2, 3, 4, 5
数字が連続して増加するこれら 5 つのブロックで、彼女は金貨を獲得します。
レベルを長時間プレイすると、番号はリセットされ、リセットされた番号は から変わります。 1 1 1 始める。したがって、レベルでは、同じ番号で異なる番号を持つ複数のピアノ タイルを叩くことが可能です。
金貨を獲得するには、同じレベルで数字が増え続けるピアノ タイルが 5 つだけ必要であることに注意してください。
ミス・ルーの優れた力により、彼女は 4 つのレベルを突破しました。Miss Lu には 4 つの難易度レベルが与えられました AAあ、 BBB、 CCC そして DDだ ピアノ タイルのヒット数。Lu さんはこれら 4 つのレベルで合計何枚の金貨を獲得できますか?
最初の行には正の整数が含まれています んんん( 1 ≤ n ≤ 1 0 5 1 ≤ n ≤ 10^51≤ん≤105)、4 つのレベルで Miss Lu がヒットしたピアノ タイルの合計数を表します。
次 んんん 各行に 3 つのパラメータを入力します。 あいあい1つの私、 ビビb私( 1 ≤ ai 、 bi ≤ 1 0 9 1 ≤ a_i、b_i ≤ 10^91≤1つの私,b私≤109)そして ci c_ic私( ci ∈ { ′ A ′ , ′ B ′ , ′ C ′ , ′ D ′ } c_i は {'A', 'B', 'C', 'D'} に含まれるc私∈{′あ′,′B′,′C′,′だ′})、それぞれ各ピアノ タイルの数、数量、レベルを表します。
Miss Lu が取得できる金貨の総数を表す整数を出力します。
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
3
レベル用 AAあ、初め 1, 2, 3, 4, 5
金貨を入手すると、2, 3, 4, 5, 6
別の金貨を入手できます。
レベル用 BBB,7, 8, 9, 10, 11
金貨が手に入る。
したがって、合計 3 3 3 金貨。
5
1 1 C
2 2 C
3 2 C
4 2 C
6 1 C
0
レベルで CCC では5回連続で増加する数字は得られないため、金貨の枚数は 0 0 0。
この問題は、ハッシュ テーブルとソートを使用して解決できます。具体的な考え方は以下のとおりです。
ハッシュテーブルを使用する cnt
各レベルで各数字が出現する回数を記録します。キーはレベルの文字と数字の組み合わせで、値はレベル内で数字が出現する回数です。
レベルの文字と数値に従って入力データを並べ替え、同じレベルの数値が連続していることを確認します。
並べ替えられたデータをスキャンし、各数値について、その 5 つの連続する数値がすべて現在のレベルに存在するかどうかを判断します。存在する場合は、これら 5 つの数値の出現数の最小値を取得し、それを答えに含めて、これら 5 つの数値の出現数から最小値を減算します。
最終的な答えは、条件を満たすすべての金貨の合計です。
時間計算量は O ( n log n ) O(n log n)お(ん見よグん)、空間の複雑さは O(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()
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);
}
}
#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つの私。
ルーさんは、美しい庭園はユニークであるべきだと感じています。 n − 1 n-1ん−1 植えられた花の美しさの価値は同じですが、 1 1 1 植えられた花の美しさは他の花とは異なります。
操作ごとに、ミス・ルーは花を選択し、その美しさの価値を高めることができます。 1 1 1 またはマイナス 1 1 1。
さて、ルーさんは、庭をユニークなものにするためにどれくらいの作業が必要になるかを知りたいと考えています。
最初の行には正の整数が含まれています んんん、庭の長さを示します。
2行目には次の内容が含まれます んんん 正の整数 a 1 、 a 2 、 … 、 a_1、 a_2、 ldots、 a_n1つの1,1つの2,…,1つのん、それぞれの花の美しさの値を示します。
庭園を一意にするために必要な操作の最小数を表す整数を出力します。
4
1 2 3 4
2
最適な解決策は、中央値になり、中央値になるためのすべてのコストを列挙することです。
時間計算量は O ( n log n ) O(n log n)お(ん見よグん)、空間の複雑さは O(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()
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));
}
}
#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;
}
LYA は最近、キャラクター ペイントに夢中になっています。キャラクター ペイントの美しさは、キャラクター ペイント内に連続する同じシンボルの数に等しいと信じています。たとえば、「aabbccddef」というキャラクターの絵の美しさは次のとおりです。 6 6 6。
LYA さんの友人が彼女に贈ったのは、 0 0 0 そして 1 1 1 キャラクターを描くことに夢中になったLYAは、この文字列を構成するすべての文字列を知りたいと考えています。部分文字列美学の合計は何でしょうか?
注: があります C n + 1 2 C^{2}_{n+1}Cん+12 部分文字列。
最初の行に正の整数を入力します んんん、文字列の長さを示します。
2行目の長さは んんん の 01 01 01 弦。
すべての部分文字列の美しさの合計を表す整数を出力します。
4
0011
14
1 ≤ n ≤ 2 × 1 0 5 1 ≤ n ≤ 2 倍 10^51≤ん≤2×105
この問題は、プレフィックスサムの考え方によって解決できます。
まず、文字列の部分文字列の合計数を計算できます。 n ( n + 1 ) 2 の分数{n(n+1)}{2}2ん(ん+1)。
次に、文字列を反復処理し、変数を使用します。 lll 現在の連続する同一シンボルの開始位置を記録します。変数 rrr 現在位置を記録します。いつ s [ r ] ≠ s [ r − 1 ] s[r] ≠ s[r-1]s[r]=s[r−1] のときは、新しいシンボルが出現し、計算できることを意味します。 [ 左 、 右 ) [ 左 、 右 )[l,r) 区間内の部分文字列の数、つまり ( r − l ) ( r − l + 1 ) 2 frac{(rl)(r-l+1)}{2}2(r−l)(r−l+1)、部分文字列の合計数からそれを減算します。
最後に残るのは、出力できるすべての美しい部分文字列の数です。
時間の複雑さ O(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)
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;
}
}
#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;
}
Miss Lu には非常に壮大な計画があり、世界中のすべてのアレイを削除したいと考えています。ただし、彼女の能力は限られており、毎回配列内の 2 つの同一の要素を選択し、それらの間にあるすべての要素 (2 つの要素自体を含む) を削除することしかできません。
さて、ミス・ルーの前には、 んんん の配列 ああ1つの、彼女は、この配列内の最大でいくつの要素を削除できるかを知りたいと考えています。
最初の行には正の整数が含まれています んんん、配列を表します ああ1つの 長さ。
2行目には次の内容が含まれます んんん スペースで区切られた正の整数 a 1 、 a 2 、 … 、 a_1、 a_2、 ldots、 a_n1つの1,1つの2,…,1つのん、配列を表します ああ1つの 要素。
Miss Lu が削除できる要素の最大数を示す整数を出力します。
4
1 2 1 2
1
この問題は、ソートとダブル ポインタのアイデアを使用して解決できます。
まず、配列を変換できます ああ1つの の要素は値によって並べ替えられ、配列内の各要素の元の位置が記録されます。この目的は、同じ要素の位置範囲を見つけやすくすることです。
次に、ソートされた配列を反復処理して、要素ごとに、それと同じ値を持つすべての要素の位置範囲を見つけます。 [ 左、右 ] [ 左、右 ][ら,R] 。この範囲の要素は、元の配列内の 2 つの同一要素の間に位置するため、削除できます。範囲を計算できます [ 左、右 ] [ 左、右 ][ら,R] の要素の数 R − L − 1 R - L - 1R−ら−1、現在の削除要素の最大数と比較し、最大値を更新します。
最後に、削除された要素の最大数を出力します。
時間計算量は O ( n log n ) O(n log n)お(ん見よグん) 、主に並べ替えの時間の複雑さです。空間の複雑さは、 O(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)
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);
}
}
#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;
}
ここでは、上級生向けの秋採用コンパニオン チェックイン キャビンをお勧めします。これは、31 日間で一般的なインターネット筆記試験の問題を解決するためのステップバイステップのガイドです。
【秋採用チェックイン】Day01 - カスタマイズされた並べ替え - CSDN ブログ
【秋採用チェックイン】Day02~最強の二部構成シリーズ~バイナリサーチ~CSDNブログ
【秋採用チェックイン】Day03 - 最強の2点シリーズ - 2点回答 - CSDNブログ
以前の主要メーカーからの実際の質問に関するオンライン レビューを提供しています。興味のある友人は、Qinglong にプライベート メッセージを送信して詳細を確認できます。
もっともっと!その上!