A - Find The Array
思路
必须出现ai - 1或者ai - 2或者ai = 1,所以最小肯定是每次加2
代码
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main ()
{
int t;
cin >> t;
while (t --)
{
int s;
cin >> s;
int two = 2, ans = 0;
int s2 = s, ans2 = 0, three = 3;
s -= 1;
ans ++;
while (s > 0)
{
s -= two;
two += 2;
ans ++;
}
s2 -= 1;
ans2 ++;
while (s2 > 0)
{
s2 -= three;
three += 2;
ans2 ++;
}
cout << min (ans, ans2) << endl;
}
}
B - Maximum Cost Deletion
思路
不用管a,然后看有多少个0区间和1区间
代码
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main ()
{
int t;
cin >> t;
while (t --)
{
int n, a, b;
cin >> n >> a >> b;
char s[105];
int ans = 0, sum1 = 0, sum0 = 0;
for (int i = 0; i < n; i ++)
cin >> s[i];
if (b >= 0)
cout << n * a + n * b << endl;
else
{
if (s[0] == '0') sum0 ++;
else sum1 ++;
for (int i = 1; i < n; i ++)
{
if (s[i] == s[i - 1])
{
continue;
}
else
{
if (s[i] == '1')
sum1 ++;
else
sum0 ++;
}
}
cout << min (sum0 + 1, sum1 + 1) * b + a * n << endl;
}
}
}
C - Manhattan Subarrays
题目大意
给你一个字串,让你找出连续子串中满足任意三点满足d(p,r)!=d(p,q)+d(q,r),其中pqr为b[i], b[j], b[k],d为曼哈顿距离
思路
如果j在i,k两个点围成的矩形中,则满足d(p,r)=d(p,q)+d(q,r),即单调递增/减时满足,d(p,r)=d(p,q)+d(q,r)
很容易证明,不能有超过三个非严格单调的子序列,由抽屉原理易知,发现这样子序列最多是四个点,接下来暴力就好了,时间复杂度为O(n)。
代码
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int a[N], n;
bool check (int l, int r)
{
for (int i = l; i < r - 1; i ++)
for (int j = i + 1; j < r; j ++)
for (int k = j + 1; k <= r; k ++)
if ((abs (a[i] - a[k]) + abs (i - k)) == (abs (a[i] - a[j]) + abs (i - j) + abs (a[j] - a[k]) + abs (j - k)))
{
// cout << "i = " << i << " j = " << j << " k = " << k << endl;
return false;
}
// cout << " l = " << l << " r = " << r << endl;
return true;
}
int main ()
{
int t;
cin >> t;
while (t --)
{
cin >> n;
int ans = 0;
for (int i = 1; i <= n; i ++)
cin >> a[i];
for (int i = 1; i <= n; i ++)
for (int j = i; j <= min (i + 3, n); j ++)
{
ans += check (i, j);
// if (check (i, j))
// cout << "i = " << i << ";j = " << j << endl;
}
cout << ans << endl;
}
}