五一集训讲课内容(4.28-5.2)

发布时间 2023-06-13 18:25:29作者: 王薪铭啊

五一集训讲课内容(4.28-5.2)

比赛注意

开头写文件读入、写出的两行代码。

freopen("文件名.in","r",stdin);
freopen("文件名.out","w",stdout);

内存限制为256MB最多开6e7的int型数组
内存限制为512MB最多开1e8的int型数组
1e9的数组绝不能开!!!

时间限制1000ms,for循环最多循环1e9次

大量数据(1e6以上)读入要用scanf

(基础语法回顾)

基本数据类型

数据名称 数据范围(二进制) 数据范围(十进制) 数据格式
int(整数类型) \(-2^{31}\sim2^{31}-1\) \(-2\times10^9\sim2\times10^9\) %d
long long(整数类型) \(-2^{63}\sim2^{63}-1\) \(-9\times10^{18}\sim9\times10^{18}\) %lld
unsigned long long(整数类型) \(0\sim2^{64}-1\) \(0\sim1\times10^{19}\) %lld
float(浮点数类型) \(-3.4\times10^{-38}\sim3.4\times10^{38}\)(有效位数\(6\sim7\)位) %f
double(浮点数类型) \(-1.7\times10^{308}\sim1.7\times10^{308}\)(有效位数\(15\sim16\)位) %lf
char(字符类型) \(-128\sim127\) %c
bool(布尔类型) 0或1

scanf、prinf用法

scanf读入屏蔽

	int a,b,c;
	scanf("%d+%d,%d",&a,&b,&c); 
	printf("%d %d %d",a,b,c);
//	键盘输入:1+2,3  
//	scanf可以无视“+”使得a,b,c值分别为1 2 3

printf用法

int a=123;
long long b=12345678900;
double c=3.14;
printf("%d %lld %lf",a,b,c); //输出123 12345678900 3.140000
double a=3.145;
printf("%.2lf",a); //double保留2位小数 
int a=1;
printf("%3d",a); //%3d表示输出3位整型数,不足位数右对齐左边用空格填充 
printf("\n");
printf("%03d",a); //%03d表示输出3位整型数,不足位数用0填充

注意:printf 中没有&,scanf 中才有

变量作用域

作用域是变量可以发挥作用的代码块。

全局变量的作用域,自其定义之处开始,至文件结束位置为止。全局变量在定义时若没有赋初值,其默认值为 0。

局部变量的作用域,自其定义之处开始,至代码块结束位置为止。

由一对大括号括起来的若干语句构成一个代码块。

#include<bits/stdc++.h>
using namespace std;

int g = 20;  // 定义全局变量

int main()
{
	int g = 10;         // 定义局部变量
	printf("%d\n", g);  // 输出 g
	for(int i=1;i<=5;i++)
		printf("%d\n",i);
//	printf("%d",i);
	return 0;
}

算术运算符

算术运算符 功能
+
-
*
/
% 取模
++ 自增
-- 自减

注意:%只能整数取模,小数不能取模

关系运算符

关系运算符 功能
> 大于
< 小于
== 等于
>= 大于等于
<= 小于等于
!= !=

逻辑运算符

&&与、||或、!非、^异或

a&&b:当a、b都为真(非零)时,其为1。

a||b:当a、b至少有一个为真(非零),其为1,否则为0。

!:!a,当a为假(0)时,其为1,a为真(1)时,其为0。

a^b:当两个条件刚好一个为真(非零)时,其为1,否则为0。

注意:

int a=-1;
if(-10<=a<=0) //-10<=a<=0 无这种写法 
	printf("yes1"); 
if(-10<=a&&a<=0) // -10<=a&&a<=0 正确写法 
	printf("yes2");

(常用函数)

数学函数

函数 含义 写法 举例
double sqrt(double x) 对x开平方 a=sqrt(9) a=3
double pow(double x,double y) 求x的y次方 a=pow(3,2) a=9
int abs(x) 求整数的绝对值 a=abs(4),b=abs(-3) a=4,b=3
double abs(double x) 求实数的绝对值 a=fabs(4.0),b=fabs(-3.5) a=4.0,b=-10
double ceil(double x) 向上取整,值是大于等于x的最小整数 a=ceil(3.1),b=ceil(-10.5) a=4,b=-10
double floor(double x) 向下取整,值是小于等于x的最大整数 a=floor(3.1),b=floor(-10.5) a=3,b=-11

memset数组清零

例子:

int a[50];
memset(a,0,sizeof(a)); 
//将数组内50个元素值全部清零,
// 中间只能赋值0或-1,给数组所有元素赋值0或-1 
for(int i=0;i<50;i++)
	printf("%d\n",a[i]); 

(字符串)

字符数组

字符数组读入方法

用 scanf 读入整个数组:scanf("%s",s);

用 scanf 逐个元素读入:scanf (“%c”,&s[0]);…注意:可能
会读入回车

用 cin 输入整个数组:cin>>s

用 cin 逐个元素输入:cin>>s[0];…不会读入回车

用 fgets 读入一行:fgets(s,sizeof(s),stdin); …可以读入空格,遇到
换行符后结束,换行符作为 s 的最后一个字符

字符数组输出方法

用 cout 输出整个数组:cout << s; …最常用

用 cout 逐个元素输出:cout<<s[0];…

用 printf 逐个元素输出:printf ("%c",s[0]);…

用 puts 输出一行并回车:puts(s);

字符数组常用函数

strlen()表示字符数组长度,以'\0'为结束标志。

例如:

char a[50]="123";
int len=strlen(a); 
cout<<len;//len为3

gerchar()读一个字符,可以是空格和换行。

例如:

char a=getchar();//读取一个字符赋值给a 
getchar();//读取一个字符 

sscanf(s,”%d”,&n); 从字符数组 s 中读取数字,并赋值给n。

例如:

char s[100]="123 45";
int a,b;
sscanf(s,"%d %d",&a,&b); 
printf("%d %d",a,b);//输出123 45 

sprintf(s,”%d”,n); 把一个 int 类型的数 n 输出到字符串 s 中。

例如:

char s[100];
sprintf(s,"%d+%d=%d",1,2,3);
printf("%s",s);输出1+2=3 

strcpy(a,b)将b字符数组的数据复制到a

例如:

char a[100];
strcpy(a,"hello"); //给字符数组赋值常量
char b[100];
strcpy(b,a);// a字符数组的数据复制到b 
printf("%s %s",a,b);//输出hello hello 

(不能直接给字符数组赋值,除非在定义时初始化:char a[100]="hello")

strcmp(a,b)按照字典序比较两个字符串(从左到右比较两个字符串中字符的ASCII值,相同则比较下一位),a>b返回1,a<b返回-1,a==b返回0

例如:

char a[100]="a";
char b[100]="b";
if(strcmp(a,b)>0)
	printf("a>b");
else if(strcmp(a,b)==0)
	printf("a==b");
else
	printf("a<b"); //输出a<b 

STL中的string类型

string输入

初始化string str="sbcd"

带空格整行读入 getline(cin,str);

string输出

输出单个字符可以用 printf:
for(int i = 0; i < str.size(); i++) printf( “ %c “ ,str[i]);
输出 abcd

要读入或者输出整个字符串,一般只能用 cin 和 cout

string 的运算

字符串可以做“加法”运算。加法是把两个字符串直接拼接起来

例如:

string str1="123",str2="456";
string str3=str1+str2;
cout<<str3;//输出123456 

字符串还可以做“关系”运算,是按照字典序比较两个 string 类型的大小。

例如:

string str1="aa",str2="aaa",str3="abc";
if(str1 < str2) printf( "OK1" );// 输出OK1
if(str1 < str3) printf("OK2");// 输出OK2

string常用函数

s_str() 将 string 转换成字符数组

s.size()和s.length()一样 求字符串s的长度

s[i] 下标为i的字符

s1+s2 连接s1和s2字符串

s1=s2 s1替换成s2字符串

s1==s2 比较两个字符串是否相同

! = < > <= >= 按字典序比较

s.insert(pos,s2) 在s下标为pos的元素前插入s2字符串

s.substr(pos,n) 从s中提取下标pos起的n个字符,相当于是一个字符串

s.erase(pos,n) 删除下标pos起的n个字符

s.find(s2,pos) 在s下标为pos的元素起查找s2首次出现的位置,如果找不到,返回string::npos。将其强制转换为int类型后才是-1。