A - 4299. 删点

Code

#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

#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. 截断数列

题目描述

avatar

解题思路

对于给出的数字,将它的所有数位求和sum
要求每一部分的各位数字之和都相等,所以段数k一定可以整除sum

Code

#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;
} 
上一篇 下一篇