模拟赛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
没有认真做题