Я пытался решить этот проблема.
Целое число M и непустой индексированный с нуля массив A, состоящий из N
даны неотрицательные целые числа. Все целые числа в массиве А меньше
или равно М.Пара целых чисел (P, Q), такая, что 0 ≤ P ≤ Q < N, называется ломтик
массива А. Срез состоит из элементов A [P], A [P + 1], …,
А [Q]. Отдельный срез — это срез, состоящий только из уникальных чисел.
То есть, ни один отдельный номер не встречается более одного раза в срезе.Например, рассмотрим целое число M = 6 и массив A такой, что:
A[0] = 3 A[1] = 4 A[2] = 5 A[3] = 5 A[4] = 2
Существует ровно девять различных срезов: (0, 0), (0, 1), (0, 2), (1,
1), (1,2), (2, 2), (3, 3), (3, 4) и (4, 4).Цель состоит в том, чтобы рассчитать количество отдельных срезов.
Заранее спасибо.
#include <algorithm>
#include <cstring>
#include <cmath>
#define MAX 100002
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
using namespace std;
bool check[MAX];
int solution(int M, vector<int> &A) {
memset(check, false, sizeof(check));
int base = 0;
int fibot = 0;
int sum = 0;
while(fibot < A.size()){
if(check[A[fibot]]){
base = fibot;
}
check[A[fibot]] = true;
sum += fibot - base + 1;
fibot += 1;
}
return min(sum, 1000000000);
}
Решение не правильное, потому что ваш алгоритм неверен.
Прежде всего, позвольте мне показать вам контрпример. Позволять A = {2, 1, 2}
, Первая итерация: base = 0
, fibot = 0
, sum += 1.
Вот так. Второй: base = 0, fibot = 1
, sum += 2
, Это тоже правильно. Последний шаг: fibot = 2
, check[A[fibot]] is true
таким образом, base = 2
, Но это должно быть 1
, Итак, ваш код возвращается1 + 2 + 1 = 4
пока правильный ответ 1 + 2 + 2 = 5
,
Правильный способ сделать это может быть так: начните с L = 0
, Для каждого R
от 0
в n - 1
двигай L
вправо, пока подмассив не будет содержать только отдельные значения (вы можете поддерживать количество вхождений каждого значения в массиве и использовать тот факт, что A[R]
это единственный элемент, который может встречаться более одного раза).
Есть еще одна проблема с вашим кодом: sum
переменная может переполниться, если int
32-битный тип на платформе тестирования (например, если все элементы A
различны).
Что касается вопроса, ПОЧЕМУ ваш алгоритм неверен, я понятия не имею, почему он должен быть правильным в первую очередь. Ты можешь доказать это? base = fibot
назначение выглядит совершенно произвольным для меня.
Других решений пока нет …