codeforse1451总结

第一题Subtract or Divide

题目

开始看题,没看懂,在看了几遍,不会做,不知道要循环多少次,于是

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read() {
   
    register int res = 0;
    register char c = getchar(), f = 1;
    while (c < 48 || c > 57) {
   
        if (c == '-')
            f = 0;
        c = getchar();
    }
    while (c >= 48 && c <= 57) res = (res << 3) + (res << 1) + (c & 15), c = getchar();
    return f ? res : -res;
}
inline void write(int x) {
   
    register char c[21], len = 0;
    if (!x)
        return putchar('0'), void();
    if (x < 0)
        x = -x, putchar('-');
    while (x) c[++len] = x % 10, x /= 10;
    while (len) putchar(c[len--] + 48);
}
int main()
{
   
        int T=read();
        while(T--)
        {
   
                int sum=0;
                int n=read();
                if(n<=3)
                {
   
                        write(n-1);printf("\n");
                        continue;
                }
                if(n%2==0)
                {
   
                        printf("2\n");
                }
                if(n%2==1)
                {
   
                        printf("3\n");
                }
        }
}

正解

solution:

这道题目乍一看不知道要循环多少次,我们观察一下样例解释的规律,可以看出几个数字都经过了 2。

考虑到任何一个大数在 -1 或自身就直接可以变成 2,再用一步就可以变成 1,不存在更优的解法。

1,2,3 除外,需要特判。

code:

#include<cstdio>
using namespace std;
int main()
{
   
	int T;
	scanf("%d",&T);
	while(T--)
	{
   
		int n;
		scanf("%d",&n);
		if(n==1)
		{
   
			printf("0\n");
		}
		else
		if(n==2)
		{
   
			printf("1\n");
		}
		else
		if(n==3)
		{
   
			printf("2\n");
		}
		else
		if(n%2==1)
		{
   
			printf("3\n");
		}
		else
		{
   
			printf("2\n");
		}
	}
	return 0;
} 

第二题 Non-Substring Subsequence

题目


](https://pic.gksec.com/2020/11/22/1be6a09781810/image.png)

其实解法很简单,仅仅只是让我们判断一个子序列是否存在,那么我们只需要在s[0,l−1]s[0,l−1] 区间内查看是否存在一个字符和 s[l]s[l],相等,如果左边不存在那么再检查右边检查从 s[r+1,n]s[r+1,n] 中是否存在一个字符和 s[r]s[r] 相等即可,如果两个条件都不满足则一定不可以构造出来,如果满足任意一个则可以输出YES.可以证明此方法为条件成立的充分必要条件,但过于简单在此忽略证明过程

代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read() {
   
    register int res = 0;
    register char c = getchar(), f = 1;
    while (c < 48 || c > 57) {
   
        if (c == '-')
            f = 0;
        c = getchar();
    }
    while (c >= 48 && c <= 57) res = (res << 3) + (res << 1) + (c & 15), c = getchar();
    return f ? res : -res;
}
inline void write(int x) {
   
    register char c[21], len = 0;
    if (!x)
        return putchar('0'), void();
    if (x < 0)
        x = -x, putchar('-');
    while (x) c[++len] = x % 10, x /= 10;
    while (len) putchar(c[len--] + 48);
}
int main()
{
   
	int T=read();
	while(T--)
	{
   
		int n=read(),q=read();
		string a;
		cin>>a;
		for(int i=0;i<q;i++)
		{
   
			int l=read(),r=read();
			bool tmp=0,tmp1=0;
			for(int i=0;i<l-1;i++)
			{
   
				if(a[i]==a[l-1])
				{
   
					tmp=1;
					break;
				}
			}
			for(int i=r;i<n;i++)
			{
   
				if(a[i]==a[r-1])
				{
   
					tmp1=1;
					break;
				}
			}
			if(tmp||tmp1)
			{
   
				cout<<"YES"<<endl;
			}
			else
			{
   
				cout<<"NO"<<endl;
			}
		}
	}
}