模拟赛1

牛牛的密码

解题思路

暴力求解

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int ok1,ok2,ok3,ok4;
string s,s1,s2,s3,s4;
int main()
{
   
    cin>>s;
    int len=s.size();
    for(int i=0;i<len;i++)//暴力求出每个字符串的字母
    {
   
        if(s[i]>='a'&&s[i]<='z'){
   ok1=1;s1=s1+s[i];}
        else if(s[i]>='A'&&s[i]<='Z'){
   ok2=1;s2=s2+s[i];}
        else if(s[i]>='0'&&s[i]<='9'){
   ok3=1;s3=s3+s[i];}
        else {
   ok4=1;s4=s4+s[i];}
    }
    printf("password level:%d\n",ok1+ok2+ok3+ok4);//输出
    if(ok1==0)printf("(Null)\n");
    else cout<<s1<<endl;
    if(ok2==0)printf("(Null)\n");
    else cout<<s2<<endl;
    if(ok3==0)printf("(Null)\n");
    else cout<<s3<<endl;
    if(ok4==0)printf("(Null)\n");
    else cout<<s4<<endl;
}

2.牛牛的跳跳棋

解题思路

这道题是一道贪心

我们可以看出,往后走是没有任何的必要的。
因为你走是可以走到 中的任意一个点,那你走回去,再走回来,其实不如你直接往前走。

那这道题就可以很愉快的用贪心解决了,在用魔法之前竟可能的走到更前面,然后在跳最后一次的地方用一次魔法。

这时候可能会有人问:为什么这样一定可以呢?

因为它无论在什么地方使用魔法,都只能在原来的基础上多走一步,那肯定就是先找到能走到最远地方的最后一点,然后再那个地方用魔法。

然后我们只要在走的时候记录一下在那些地方用了魔法,在到终点之后输出出来就可以了。

题目要求要字典序最小,那我们不往后走,而且如果有两个地方都可以跳到最远点,就选前面的那个。

AC代码

#include<cstdio>
using namespace std;
int n, a[100001], maxn = 1, maxx = 1, num[100001];
void write() 
{
   
    printf("%d\n", num[0]);
    for (int i = 1; i <= num[0]; i++) printf("%d ", num[i]);
}
int main() {
   
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) 
    {
   
        scanf("%d", &a[i]);
        if (a[i]) 
        {
   
            if (i + a[i] > maxn) //贪心,在不魔法的情况下能走多远走多远 
            {
   
                maxn = i + a[i];
                maxx = i;
                if (maxn > n) write();//可以走到终点了
            }
        }
        else if (i == maxn) //已经尽可能的走的更远了,一定要用魔法
        {
   
            num[++num[0]] = maxx;
            maxn++;
            maxx = maxn;
            if (maxn > n) write();//用完魔法就到终点了
        }
    }

    return 0;
}

3.牛牛的最大兴趣组

未做

4.牛牛的滑动窗口

未做

总结

考试
预估:100+0+0+0=100
实际:100+0+0+0=100
没有认真做题

谢谢