笔记

acm知识点01
控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。

函数名称: isascii
函数原型: int isascii(int ch)
函数功能: 测试参数是否是ASCII码0-127
函数返回: 是返回非0,否则返回0

ctype.h
isalpha© isdigit© islower© isupper© tolower© toupper©
string.h

? 判断浮点数相等if(fabs(a-b)<eps)…
? const double eps = 1e-8(根据需要的精度而定)
? 什么,这不是你想要的C++?
? 你可以用一些C++独有的头文件
? stdio.h→cstdio string.h→cstring ctype.h→cctype

? C++独有的输入输出方式,流输入输出:
#include
using namespace std;
int main()
{
int x;
cin >> x;
cout << x << endl;
}
? 流输入输出比起C的输入输出慢很多,可以用ios::sync_with_stdio(false);加速

? 头文件是
? 有很多常用的函数,比如前文提到的min, max, swap。
?
?
? sort(a,a+n) 给a[0]到a[n-1]升序排序。
是一个模板函数,对定义了<号的数据类型都可以排序,包括你写的结构体。
可以用任何你想要的方法排序。
方法是定义一个函数bool cmp(type a,type b)然后sort(a,a+n,cmp),一般来说排序结果保证任意相邻元素cmp为true

? 头文件是
? 是向量的意思,但在这里代表可变长度数组。
? 是一个模板类,用vector v来声明
? 完全可以当作数组来用,比如v[0]=1;
? v.push_back(a),在v尾部加上a。
? v.pop_back() 删除最后一个元素
v.size() v的大小
v.clear() 清空v
也可以排序。sort(v.begin(),v.end())或者sort(v,v+n)都行
比数组慢,在速度要求高的时候谨慎使用

2019.3.23
1.cout<<‘6’<<a[i]+6<<endl 输出字符串的从第6位
2.acos(-1)这是PI/2
3. if(getchar()==’(’) 作用是在输入整形后还有括号内的数据
{
cin>>a;
p[i].usetime+=a*m;
getchar();
}
4. int cmp(data a,data b) sort函数用的
{
if(a.num!=b.num) return a.num>b.num;
else if(a.usetime!=b.usetime) return a.usetime<b.usetime;
else return strcmp(a.name,b.name)<0;
}
sort(p,p+i,cmp);
5. while(k) 一个十进制的十六进制各位相加
{
sum2+=k%16;
k/=16;
}
6.数据规模,有时候可以暴力
7. 解决引号的替换问题2,A
while((c=getchar())!=EOF)// putchar(ch);
bool flag=true;
if(flag)
flag=!flag;
8.题目很长,先看一下输入输出。
9,#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[100]={0}; //没有赋初始值的默认为0
int i;
for(i=0;i<100;i++)
cout<<a[i];

return 0;
}
输出全是0
10
for(int i=0;i<n;i++)
putchar(s[(i+ans)%n]);
循环输出写的很好
11
for(int i=0;x[i]!=’\0’;i++) 字符串
控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。

函数名称: isascii
函数原型: int isascii(int ch)
函数功能: 测试参数是否是ASCII码0-127
函数返回: 是返回非0,否则返回0

ctype.h
isalpha© isdigit© islower© isupper© tolower© toupper©
string.h

?
ctype.h
memset(a,n,sizeof(a))//把a每个字节赋值成n 只取n最低8位
所以不要以为memset(a,1,sizeof(a))能把a中每个数字变成1,当然char类型除外
类似的有memcpy(a,b,sizeof(b))把b里每个字节复制进a

? 3 using namespace std;到底是什么意思?
命名空间,防止在调用他人代码时函数和变量出现冲突。
比如A写个f(),B写个f(),如果都写在自己的namespace里,调用的时候就可以用A::f()和B::f()
std则是标准库用的命名空间,为了避免每次都写std::可以在最开始加一句using namespace std;然后就默认你用到的函数都是std里面定义的。
但是容易导致你的函数和标准库的冲突,避免方法是命名不要太普通,比如首字母大写。
加不加using namespace std;其实是个信仰问题,个人觉得比赛里用也不太可能冲突

? 判断浮点数相等if(fabs(a-b)<eps)…
? const double eps = 1e-8(根据需要的精度而定)
? 什么,这不是你想要的C++?
? 你可以用一些C++独有的头文件
? stdio.h→cstdio string.h→cstring ctype.h→cctype

? C++独有的输入输出方式,流输入输出:
#include
using namespace std;
int main()
{
int x;
cin >> x;
cout << x << endl;
}
? 流输入输出比起C的输入输出慢很多,可以用ios::sync_with_stdio(false);加速

? 头文件是
? 有很多常用的函数,比如前文提到的min, max, swap。
?
?
? sort(a,a+n) 给a[0]到a[n-1]升序排序。
是一个模板函数,对定义了<号的数据类型都可以排序,包括你写的结构体。
可以用任何你想要的方法排序。
方法是定义一个函数bool cmp(type a,type b)然后sort(a,a+n,cmp),一般来说排序结果保证任意相邻元素cmp为true

? 头文件是
? 是向量的意思,但在这里代表可变长度数组。
? 是一个模板类,用vector v来声明
? 完全可以当作数组来用,比如v[0]=1;
? v.push_back(a),在v尾部加上a。
? v.pop_back() 删除最后一个元素
? v.size() v的大小
? v.clear() 清空v
? 也可以排序。sort(v.begin(),v.end())或者sort(v,v+n)都行
? 比数组慢,在速度要求高的时候谨慎使用
2019.3.23
1.cout<<‘6’<<a[i]+6<<endl 输出字符串的从第6位
2.acos(-1)这是PI/2
3. if(getchar()==’(’) 作用是在输入整形后还有括号内的数据
{
cin>>a;
p[i].usetime+=a*m;
getchar();
}
4. int cmp(data a,data b) sort函数用的
{
if(a.num!=b.num) return a.num>b.num;
else if(a.usetime!=b.usetime) return a.usetime<b.usetime;
else return strcmp(a.name,b.name)<0;
}
sort(p,p+i,cmp);
5. while(k) 一个十进制的十六进制各位相加
{
sum2+=k%16;
k/=16;
}
6.数据规模,有时候可以暴力
7. 解决引号的替换问题2,A
while((c=getchar())!=EOF)// putchar(ch);
bool flag=true;
if(flag)
flag=!flag;
8.题目很长,先看一下输入输出。
9,#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[100]={0}; //没有赋初始值的默认为0
int i;
for(i=0;i<100;i++)
cout<<a[i];

return 0;
}
输出全是0
10
for(int i=0;i<n;i++)
putchar(s[(i+ans)%n]);
循环输出写的很好
11
for(int i=0;x[i]!=’\0’;i++) 字符串
12
for(int i=0;x[i]!=’\0’;i++)

13
int a[15];
memset(a,0,sizeof(a));

14.获取一个字符
for(i = 1;i < 5;++i)
gets(str[i]);

for(k = 0;k < 4;++k)
{
if(command[j] == dr[k])
break;
}

3.24

char dr[] = {‘A’,‘B’,‘L’,‘R’};
int dir[][2] = {{-1,0},{1,0},{0,-1},{0,1}};

看不懂的题,看输入输出,可能很快就知道怎么做了

3.27
1.puts(“NO”);
string s,a; if(s[0]==a[0]||s[1]==a[1])

2
sum=max(sum,a[i]);

3
bool dfs(int x,int s)
{
if(xn)
return s%360
0?true:false;
return dfs(x+1,s+a[x+1])||dfs(x+1,s-a[x+1]);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
printf(dfs(0,0)?“YES\n”:“NO\n”);
return 0;
}

4
if(fun(mid)>=k) l=mid; 二分的等号很可怕

3.28
1
printf("%0.2f\n",floor(right*100)/100);向下取整后的写法,也就是不去四舍五入
头文件《math,h》

3.29
1在16位机器中,int占16位,取值范围为前面所说的-32768~32767(-216~216-1)。而在32位和64位机器中,int占32位,取值范围为-2147483648~2147483647(-232~232-1)。ISO/ANSI C规定,int类型的最小范围为-32768到32767。
2.能公式求和,尽量不循环相加
3。多个人,人数等于一的特殊情况

3.30
1cnt是count的缩写,用作计数器。
2
long long l=-1e12,r=1e12,mid;
没有1不行;
3.
全局变量和局部变量写重复,出错
4
int*int
等号处要小心,要去检查命名,注意相似的命名,mid,midd,传到参数里,二分套二分,bool check(long long mid)别用
acm知识 02
strlen和s.length()都是O(n)的 慎用 特别是不要放在循环条件里面 他每次都会重新算一遍

0x3f3f3f3f
有时候你会看到这个神秘的数字
比如memset(a, 0x3f, sizeof(a))
然后const int INF = 0x3f3f3f3f
之所以用这个数字 首先是因为这个数字很大 大概有1e9 满足大部分情况下我们对无穷大的要求
同时我们知道memset是按字节赋值的(如果你看过我的ppt的话),而这个数字满足每个字节都相同就可以用memset赋值。
再者有时候我们可能会直接让INF参与运算,如果单纯用一个很大的数做INF可能会溢出,如果特地对INF进行特判又比较麻烦,而这个数字相加不爆int,相乘不爆longlong非常合适

998244353,1e9+7,1e9+9
有的题会叫你输出答案时对这三个数取模
因为有的时候答案很大,如果要选手手写大整数的话很麻烦而且对C++选手不公平
和0x3f3f3f3f一样这些数字都满足相加不爆int,相乘不爆longlong
而且这三个数都是质数,对质数取模能避免模数相同的数之间具备公因数,来达到减少冲突的目的(数据结构讲到哈希表的时候会讲)
而且质数作为模数除了0都有逆元(以后学了数论再详细说)
//19260817也是质数(逃

一类大数的比较方法
大数的比较可以直接用字符串实现
可以做一下洛谷P1781 P1012
然后去做CF670F
不出意外的话这应该是你做出来的第一道div2的F题

内存对齐
冷知识 大家了解一下就好了 以后学到底层的知识再深入了解
可以运行一下下面的代码,看看结果和你想的一不一样……

struct A{
int x;
char y;
};

int main()
{
cout << sizeof(A) << endl;
cout << sizeof(char) + sizeof(int) << endl;
}4.5
/* +0.5的话,如果大于等于0.5就往前进一位,小于0.5就不
往前进,然后强制转换到int会向下取整,正好四舍五入到整数,这是一种我认为最简单的四舍五入方法。

d[i].a=d[i].t=d[i].c=d[i].g=0;

vector pos[N]
pos[i}.size不是int类型,而是unsined ll
所以需要加上 (int)pos[i].size()

位运算https://blog.csdn.net/deaidai/article/details/78167367
4.8

4.9
memset不能赋初值1,会出错。可以赋初值0;
jin今天字符串有道提做过但我凭感觉做错了,后来才发现题目没有都清楚,浪费了很多时间
i再次弄混strlen和sizeof

数组开小了,结果sizeof,数组越界

4.10
string a,b;
getline(cin,b);
getline(cin,a);//洛谷不让用gets

for(int i=0;a[i];i++)
if(isupper(a[i])) a[i]=tolower(a[i]);//变大写

b.length() //算法一定要严谨

4.11
islower() isupper () isdigit()
数据大的时候一定要防爆
做不出来再看一一遍题。

4.12
在主函数中定义的局部变量
对于int,long long ,double ,float型的数组,如果赋了初值,没有赋值的全为 0.
如果不赋,输出的结果很混乱。
strlen返回值是无符号整形直接和long long类型比较会出现很奇怪的结果

4.14
今天遇到一道怪题

cout<<fixed<<setprecision(3)<<h<<endl;
printf("%.3f\n",h);
是正确
printf("%.3lf\n",h);
是错误的
原因如下
c++标准里输出其实是没有%lf
都是%f
c++11后才承认这个符号
但是有的编译器可能会支持这个写 但是读入double是lf
有时候知错两组数据,是因为算法有较大问题,考虑不全面,有错误

4.15
if(p0) return 0;//无符号return 0
while(s[x+1]
‘0’&&x<m-1) x++;//去除末尾0
while(s[m]‘0’&&m>x+1) m–; //去除多余前导0
写代码要简洁
if(p
0) return 0;//无符号return 0 反转直接逆序输出就行了。

递归形式
for(int i=1;i<=n;i++){ //1-n的递推 for(int j=1;j<=i/2;j++){
f[i]+=f[j]; //每一位叠加,递推走起 }
f[i]++; //加上本身 }
4.16
洛谷。。选数
这个递推很有意思。。
火柴棒 如果上限很难想,就写一个笨算法先算出来。

4.17
整数如果奇数位的数字和等于偶数位的数字和,则其能被11整除
偶数位的回文数可以被11整除

一个整数除0或取余%/0,会卡

4.26
然后const int INF = 0x3f3f3f3f

5.1
1有一点想错了时候,改的地方可能不止一次。
该一处,一定要仔细检查要改的地方。

2 今天一个数组开小了,结果等到运行的时候,卡住不动,我以为是电脑的问题,最后发现是越界了。

3.注意一些赋初值的合理性,赋初值要讲道理,不能随便赋

4
struct node
{ int p,q,v; bool operator < (const node& r)const { return q - p < r.q - r.p; }
}a[maxn];
sort(a+1,a+n+1);//这个地方的排序直接按红的排了
//和上面的等价
typedef struct Node{ int p,q,v;
}node; bool cmp(node a,node b){ return a.q-a.p<b.q-b.p;
} sort(a,a+n,cmp);

5.mp.count(i)==0
使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。

5.2
1.试了一下memset函数。
这个函数可以赋初值为-1,0
但是赋值1的时候会有问题;只能赋值高位和低位相同的整形。
后来把数组换成布尔类型后。
然后有试了赋值true和false.成功赋初值为0和1了。。。

2
线性筛法
因为是按照最小素因子筛选,所以可以保证每个数都只会被筛一遍
memset(flag,0,sizeof(flag));
int cnt=0;
for(int i=2;i<=b;i++)
{
if(!flag[i]) prime[cnt++]=i;
for(intj=0;j<cnt&&prime[j]*i<=b;j++)
{
flag[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
} 看不太懂看网页吧
https://blog.csdn.net/qq_39763472/article/details/82428602

4.2 分治
sizeof 和 strlen 没有分清楚。
写代码之前思路要非常清楚,不能有半点模糊。+1

4.3
周赛b题还没打,别忘了周赛总结
4.4
ll b; ll n=sqrt(b)+0.5;向上取整
int a[N];
int fun()
{
//
a[0]=a[1]=1;
memset(a,0,sizeof(a));//0是素数,1是合数
for(int i=2;i<N;i++)
{
if(!a[i])
for(int j=i+i;j<N;j+=i)
{
a[j]=1;
}
}
return 0;
}

辗转相除法比更像减损书要快很多
辗转相除法:求m,k的最大公因数
else//求最大公约数
{
if(m > x)
{
r = x;
x = m;
m = r;
}
while(m) //保持m<=x
{
r = x % m;
x = m;
m = r;
}
m = x; //结果最后的x就是最大公因数
}

!!!const double PI=acos(-1);
double x=(-b+sqrt(bb-4.0a*c))/2.0/a;
x2=atan(x2); 正切变成角度

4.5
可以定义const常量,具有不可变性。
  例如:const int Max=100; Max++会产生错误;

#include
#include
#include
vector per;
vector::iterator it;
4.18

今天的sort卡了,原因是cmp多了一个等号
(a) 反自反性:也即comp(x, x)必须是false
(b) 非对称性:也即如果comp(x, y)和comp(y, x)的结果必然相反
© 可传递性:也即如果comp(x, y)为true,comp(y, z)为true,那么comp(x, z)必然为true
这么看到,示例代码的comp定义明显违反了(a)(b)两条,所以sort使用它时就可能工作不正常。解决办法也很简单,去掉那个“=”,再对照下”Strict Weak Ordering”的定义,应该是满足了的。

多组数据记得要清空队列。。。。

4.24
头文件。分别把数组重新排为下一个或上一个排列/

next_permutation(a,a+m)
prev_permutation(a,a+n)

细节 while(next_permutation(a+1,a+n+1)) 这个函数不是死循环,当从字典序升序到字典序降序时,就会跳出,也就是说如果时字典序降序的下个排列返回值时 0

多组数据时,记得清空计数器。

4.25

4.26
然后const int INF = 0x3f3f3f3f
多重循环的ijk一定看清楚。
然后输入的质量,价值顺序看清楚
即使是复制的输出也可能有问题,选择好输入法。

一个数列的最长不上升子序列的数目等于该数列最长上升子序列的长度 最少拦截系统

4.27
#include<bits/stdc++.h>;
using namespace std;
int main()
{
for(int i=-100;i<0;i++)
cout<<i%10<<endl;
return 0;
}
部分运行结果
0
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
-9
-8
-7
-6
-5
-4
-3
-2
-1

4.29
多重循环的变量邪虫了,然后超时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值