day 1

知识点一:全排列函数:next_permutation(start,end)/bool next_permutation(iterator start,iterator end),

O(n!);

Next_permutation()在使用前需要对欲排列数组升序排序,否则只能找出该序列之后的全排列数。当前序列不存在下一个排列时,函数返回false,否则返回true.

prev_permutation:对欲排列的数组按降序排序

知识点二:cout<<fixed<<setprecision()<<x;

控制浮点数输出的精度,保留两位小数。

只要出现了fixed,则后面都是以fixed输出(就是说,如果之后还要继续使用,不同再打一遍fixed了),如果取消,使用unself函数。例:cout.self(ios::fixed);

cout<<hex<<x<<endl;(输出十六进制)

知识点三:

知识点四:substr函数:

substr除了有字段截取的功能外,还可以用来替换字段。

(string,start<,length>)从string 的start位置开始提取字符串

length:待提取的字符串的长度,若length为一下情况时,返回整个字符串的所有字符

1、length不指定

2、length为空

3、length为负值

样例:
str="wqerwtweafs";
str1=substr(str,5);
str2=substr(str,5,"");
str3=substr(str,5,-3);
str4=sunstr(str,5,30);
注意:
substr中的start负数时返回空值
length负值时,默认从start位置截取所有字符
substr从字符串右侧截取字符的方法

substr除了有字段截取的功能外,还可以用来替换字段。

通常情况下,substr往往结合find一起使用。

转载自:https://www.cnblogs.com/huangbiquan/articles/8007613.html

知识点五:find的用法

int ans = s1.find(s2) ;  //在S1中查找子串S2;

说明:如果查找成功则输出查找到的第一个位置,否则返回-1;

int ans = s1.find(s2, 2) ;   //从S1的第二个字符开始查找子串S2;

查找子串中的某个字符最先出现的位置。

int ans = s1.find_first_of(s2) ;  //在S1中查找子串S2;(非全匹配)

其中find_first_of()也可以约定初始查找的位置:s1.find_first_of(s2, 2) ;

3.find_last_of()(非全匹配)

这个函数与find_first_of()功能差不多,只不过find_first_of()是从字符串的前面往后面搜索,而find_last_of()是从字符串的后面往前面搜索。

4.rfind()(全匹配)

反向查找字符串,即找到最后一个与子串匹配的位置

5.find_first_not_of()(非全匹配)

找到第一个与子串匹配的位置


原文链接:https://blog.csdn.net/laobai1015/article/details/62426137/;

知识点六:sprintf的用法:

sprintf函数打印到字符串中,而printf函数打印输出到屏幕上

sprintf函数的格式:
int sprintf( char *buffer, const char *format ,[argument, ...])

buffer是字符数组名;format是格式化字符串(像:"%3d%6.2f%#x%o",

char str[20];
 double f=14.309948;
sprintf(str,"%6.2f",f);
可以控制精度
5、char str[20];
int a=20984,b=48090;
sprintf(str,"%3d%6d",a,b);//要打双引号
str[]="2098448090"


可以将多个数值数据连接起来
6、char str[20];
char s1[5]={'A','B','C'};
char s2[5]={'T','Y','x'};
sprintf(str,"%.3s%.3s",s1,s2);


可以将多个字符串连接成字符串
%m.n在字符串的输出中,m表示宽度,字符串共占的列数;n表示实际的字符数。%m.n在浮点数中,m也表示宽度;n表示小数的位数。
7、可以动态指定,需要截取的字符数
char s1={'A','B','C'};
char s2={'T','Y','x'};
sprintf(str,"%.*s%.*s",2,s1,3,s2);


sprintf(s, "%*.*f", 10, 2, 3.1415926);小数点之前的宽度;小数点后几位


8、sprintf(s, "%p", &i);
可以打印出i的地址
上面的语句相当于
sprintf(s, "%0*x", 2 * sizeof(void *), &i);
9、sprintf的返回值是字符数组中字符的个数,即字符串的长度,不用在调用strlen(s)求字符串的长度。

转自:http://nnssll.blog.51cto.com/902724/198237/

知识点七:最长公共子序列(LCS):

不唯一;

详细笔记:

https://www.cnblogs.com/Lee-yl/p/9975827.html

题目:

https://www.luogu.com.cn/problem/P8638?contestId=154515

时间O(n * m),空间O(n * m)

模板:

知识点八:to_string();

知识点九: 链式前向星:

图储存的方式:{

1.邻接矩阵

2.邻接表(以点为基本单位)

3.链式前向行(以边为基本单位)

}

题目1:

P8808 [蓝桥杯 2022 国 C] 斐波那契数组 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目的斐波那契数组中的a0,a1,不一定是1,且不同的首项,数组不一样,对应修改的元素个数也有偏差。要求求修改的个数最少。

首先我们来证明一个东西:

如果 a是一个斐波那契数组,那么满足以下关系式:

首先我们来证明一个东西:

ai=fi*a1(i>=3)

其中,f表示原始的斐波那契数列;

证明如下:a1=a2=x

a3=2*x

a4=(1+2)*x=3x,

a5=(2+3)x=5x;

#include<bits/stdc++.h>
using namespace std;
int n,a[100010],s=0,t[1000010],maxx=-1,f[100010]={0,1,1},l=2,maxxx=10000000;
int main()
{
    scanf("%d",&n);
    for( int i=1;i<=n;i++) scanf("%d",&a[i]),maxx=max(maxx,a[i]);
    while(1)
    {
    	if(f[l-1]+f[l]>maxxx) break;
    	l++;//顺便记录数组可改范围
    	f[l]=f[l-2]+f[l-1];//记忆化搜索斐波那契数列;
	}
	for( int i=1;i<=l;i++) if(a[i]%f[i]==0) t[a[i]/f[i]]++;
	for( int i=1;i<=maxx;i++) s=max(s,t[i]);
    printf("%d",n-s);
    return 0;
}

  • 40
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值