我自己写的部分,复杂是O(N);
#include <bits\stdc++.h>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
vector<int> a(n + 1);
a[0] = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
bool flag = true;
int r = m / (n + 1);
int last_j = 0;
int sume = 0;
for (int i = 0; i < m; i++)
{
flag = true;
int j = last_j; // 省的每次从头开始
while (flag && a[j] < i && a[j + 1] <= i)
{
j++;
if (j >= n)
{
j = n;
flag = false;
}
last_j = j;
}
// 这个while循环结束的时候j就是要要找的序列f
sume += abs((i / r) - j);
}
cout << sume;
system("pause");
return 0;
}
非常奇怪的事情是这个是时间超限的,但事实上,我在之前延续上一题的做法时,开了三个N大小的数组,导致内存超限,并且当时用了三个for循环,每个都是N次,没有超时(大概在900ms)。我把内存超限改了之后就变成时间超限了。。。非常难以理解,不禁对csp的判定产生疑惑