这周生病了,每日VP计划有点搁浅,大多数D题都没补,等痊愈了把D题的题解续上。先把前三题写了。
A. Integer Moves
题意:原点为 ( 0 , 0 ) (0,0) (0,0),每次位移只能是整数,问从原点移动到目标点需要几步。
思路:刚开始想假了,以为还有3步以上的情况。(发烧降智)其实只分原点 0步 ,直线距离开跟为整数 1步,其他情况 2步。
inline void solve()
{
int a, b;
cin >> a >> b;
int sum = a * a + b * b;
if (a == 0 && b == 0)
{
cout << 0 << endl;
return;
}
if (sum == (int)sqrt(sum) * sqrt(sum))
{
cout << 1 << endl;
return;
}
else
{
cout << 2 << endl;
}
}
B. XY Sequence
题意:
数组进行两种操作: a i = a i − 1 + x a_i = a_{i-1} +x ai=ai−1+x or a i = a i − 1 − y a_i = a_{i-1} -y ai=ai−1−y
思路:没啥特别的跟着模一遍就出了
inline void solve()
{
int n, b, x, y;
cin >> n >> b >> x >> y;
int sum = 0;
for (int i = 1; i <= n; i++)
{
int tt = a[i - 1] + x;
if (tt > b)
a[i] = a[i - 1] - y;
else
a[i] = a[i - 1] + x;
sum += a[i];
// cout << sum << " ";
}
cout << sum << endl;
}
C. Bracket Sequence Deletion
题意:
给你一个由n个字符组成的括号序列’(‘和/或)’。你对它进行若干操作。
两种操作:
- 这个前缀是一个正规的括号序列。
- 这个前缀是一个长度至少为2的回文。
如果通过在这个序列中插入字符’+'和’1’可以得到一个正确的算术表达式,那么这个括号序列就被称为有规律的。当不可能找到一个好的前缀时,你就停止执行操作。你的任务是找出你将对给定的字符串进行的操作的数量和字符串中剩余的字符数。
解题思路:
- 如果字符串的第一个字符为
(
,那么我们就可以操作一次,将长度为2 22
的前缀子串删去,因为(无论后面接什么都满足条件:()
为规律括号序列,((
为回文括号序列; - 如果字符串的第一个字符为
)
,由于)开头的括号序列不可能是规律的,因此我们只能找回文序列,)
开头的最短的回文序列就是找到最近的下一个)
,其间可能有任意多个(
,因此我们可以操作一次,将这一整个子串全部删去。
inline void solve()
{
cin >> n;
string s;
cin >> s;
int l = 0;
int cnt = 0;
while (l + 1 < n)
{
if (s[l] == '(' || (s[l] == ')' && s[l + 1] == ')'))
{
l += 2;
}
else
{
int r = l + 1;
while (r < n && s[r] != ')')
{
++r;
}
if (r == n)
{
break;
}
l = r + 1;
}
++cnt;
}
cout << cnt << ' ' << n - l << endl;
}
D
周末有空补一下