A - 4299. 删点
Code
cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, cnt1 = 0, cnt2 = 0;
cin >> n;
for (int i = 1; i <= n; i++)
{
int x, y;
cin >> x >> y;
if (x < 0) cnt1++;
else cnt2++;
}
if (cnt1 > 1 && cnt2 > 1) puts("No");
else puts("Yes");
return 0;
}B - 4300. 两种操作
Code
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 20010;
int n, m;
int d[N];
int main()
{
cin >> n >> m;
memset(d, 0x3f, sizeof d);
d[n] = 0;
queue<int>q;
q.push(n);
while (q.size())
{
auto t = q.front();
q.pop();
if (t - 1 >= 1 && d[t - 1] > d[t] + 1)
{
d[t - 1] = d[t] + 1;
q.push(t - 1);
}
if (t * 2 < N && d[t * 2] > d[t] + 1)
{
d[t * 2] = d[t] + 1;
q.push(t * 2);
}
}
cout << d[m];
return 0;C - 4301. 截断数列
题目描述

解题思路
对于给出的数字,将它的所有数位求和sum
要求每一部分的各位数字之和都相等,所以段数k一定可以整除sum
Code
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, sum;
char d[N];
int main()
{
cin >> n >> d;
for (int i = 0; i < n; i++)
{
d[i] -= '0';
sum += d[i];
}
for (int k = 2; k <= n; k++)
if (sum % k == 0)
{
bool flag = true;
int s = sum / k;
for (int j = 0, t = 0; j < n; j++)
{
t += d[j];
if (t > s) // 一旦加上某段是大于0的,说明不符合
{
flag = false;
break;
}
else if (t == s) t = 0; // 置零后开始下一段
}
if (flag)
{
puts("YES");
return 0;
}
}
puts("NO");
return 0;
}
