算法竞赛入门经典第二版 第三章笔记和答案

数组和字符串的处理

1.数组的注意点
a.数组是从0开始计算,最后一个是n-1;

int a[100]最大的下标是99
b.数组在main外面可以开到很大,里面却不行,稍微大一点就爆了,
竞赛时候要看清题目数据开数组,一般只要在题目数据的范围上加上一个10的数组就好了
看清题目范围
看清题目范围
看清题目范围

c**.时刻注意一下数组的下标**,避免下标越界,访问错误;

  1. memset函数
    在数组里面给每个数组赋上一个数字不用循环一个个赋值浪费时间,直接用memset(a,0,sizeof(a));//用0填到a里面去,sizeof计算a的大小;
    memset(a,o,sizeof(a))
    equal:
    for(int i=0;i<n;++i)
    {
    a[i]=0;
    }

    3.例题关灯问题;
    题目见《算法竞赛入门经典第二版》
    啊啊啊啊啊:我们发现一个灯只有2种状态关的不关,这么一看似乎真的有那么巧合,一切都和flag相似,flag为true表示开灯,flag为false表示假;
    哈哈哈哈:我们枚举一个数组是否为固定东西的倍数时候有2种方法,一个是一个个枚举看看是否符合倍数,另一个是每次i++改为i+=x;每次加上x就一定是x的倍数
    这个题就是一个个模拟枚举就好了
#include <iostream>
using namespace std;
int a[10010];
int main()
{
    
    
	int n,i,k,j;cin>>n>>k;
	for(i=1;i<=k;++i)
	{
    
    
		for(j=i;j<=n;j+=i)
			{
    
    
				a[j]=!a[j];//每次开的关了,关的开了,那么就是相当于每次取反
			}
	}
	for(i=1;i<=n;++i)
	{
    
    
		if(a[i]) cout<<i<<' ';
	}

 } 

2.蛇形数组,这题看书上就好了,不国有个可用性很高的模板,而且可以直接套进去写,不用怕错误,很多题目都可以套模板蓝桥杯经常用
超级好的模板
超级好的模板

超级好的模板
私信我或者在下面留言
私信我或者在下面留言
私信我或者在下面留言
//有视频和题解

在这里插入图片描述
在这里插入图片描述

3.字符数组
字符数组注意点(较多私信我或者留言)
tex的括号:
思路:这里发现只有2种情况?等等 2种情况?和上面异曲同工
直接flag
介绍2个函数:
合法的竖式题解:
a.strchr(数组,比较的字符)//在数组里面找到比较的字符放回第一个出现的地址如果没找到就返回NULL
b.sprintf(数组,“%d is sads”,元素);
伪代码:
char s[20];
int count=0;
scanf("%s",s);
for(不断生成abcde)
{
if(abc
de合法而且abc*de在数组中)
{
count++;
输出

#include <cstdio>
#include <cmath>
#include <string.h>
#include <iostream>
using namespace std;
char s[10010],m[10010];
int main()
{
    
    
   int count=0;
   scanf("%s",s);
  for(int abc=111;abc<=999;++abc)
  {
    
    
  	for(int de=11;de<=99;++de)
  	{
    
    
  		int z=abc*de,y=abc*(de/10),x=abc*(de%10);
  		sprintf(m,"%d%d%d%d%d",abc,de,x,y,z);
  		int ok=1;
  		for(int i=0;i<strlen(m);++i)
  		{
    
    
  			if(strchr(s,m[i])==NULL) ok=0;
		  }
		  if(ok)
		  {
    
    
		  	cout<<"count"<<count<<endl;
			  count++;
		  	printf("%5d\nx%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
		  }
	  }
  }
}
sprintf(m,"%d%d%d%d%d",abc,de,x,y,z);/看成是%d%d%d%d%d用abc,de,x,y,z填充掉,输入到字符串m里面//sprintf;
if(strchr(m,s[i]==NULL/在m里面查找s[i],因为没有找到就会返回NULL只要NULL就是没找打不符合条件就退出;

wertyu:
题目看书本:
题解

#include <iostream>
#include <string>
using namespace std;
char s[]="1234567890-=qwertyuiop[]asdfghjkl;'zxcvbnm,./'";
string m;
int main()
{
    
    
	char c;
	int i;
	while(cin>>c)
	{
    
    
		for( i=0;s[i]&&s[i]!=c;++i);
		if(s[i]) cout<<s[i-1];
		else cout<<c;
	} 
}

技巧:这里是s[]s里面没有填数字,直接在后面输入一群数字,编译器可以自己计算出来有多少长度
接下来介绍一个方法:打表 打表 打表
所谓打表就是在编译器时间复杂度很大,但是你已经可以知道答案是多少,直接将答案输出,达到01的复杂度;
题目生成元:
如果x加上x的各个元素的和得到y,那么就说y是x的生成元;x是y的原始元;
任意一个输入n,输出n的原始元。
思路:
这题如果每次都去枚举的话会超时;
所以不能枚举,我们不妨从一开始就把每个元素和对应的生成元绑定在一起就好,然后对应输出:

在这里插入代码片

环状字数:模板题;
**这个总结想要的可以私信我具体就是用到e.erase()这个函数
在这里插入图片描述
**
回文数字还要课后一些习题就下一期分享把,这次太累了好啦要去比赛了

猜你喜欢

转载自blog.csdn.net/m0_51373056/article/details/109270232