C++ 常用的一些方法与技巧

发布时间 2023-08-15 15:37:52作者: 未翻身的咸鱼

C++部分知识

自定义变量类型:

typedef long long LL;//自定义一个变量类型
LL ans;//用LL类型创建一个变量

打印

endl 意为end line,有以下两个作用:
①换行;
②对缓冲流进行冲刷,使得流中所有剩余字符被写入输出序列。
也即加<<endl后会有一个换行。下次再用cout输出字符时就会在下一行开始输出,如果不加,就会跟在当前行的最后输出。

using namespace std;
cout<<" "<<z<<endl;

保留小数问题


#include<iostream>
#include<iomanip>//必要头文件 
using namespace std;
int main()
{
   double sum;
   sum=4.56789;
   cout<<"方法一:保留两位小数"<<endl;
   //第一种方法也是最常用的方法 
   cout<<fixed<<setprecision(2)<<sum<<endl;
   
   cout<<"方法二:保留三位小数"<<endl;
   cout.setf(ios::fixed);
   cout<<setprecision(3)<<sum<<endl;
   
   cout<<"方法三:保留四位小数"<<endl;
   cout<<setiosflags(ios::fixed)<<setprecision(4)<<sum<<endl;
   
   cout<<"方法四:保留六位小数"<<endl;
   cout<<setprecision(6)<<sum<<endl;
   return 0; 
} 

万能库

#include<bits/stdc++.h> :包含了c++绝大多数的库,节省大量时间,很方便

math库

  • 在竞赛中有大量计算需要用到math库中的函数,以下是一些常用函数的总结

四舍五入

ceil(x) x上取整函数

floor(x) x的下取整函数

fmod(y, x) y/x的余数

round(x) x的四舍五入值

绝对值

fabs(x) x的绝对值函数

abs(x) x的绝对值

fmax(x, y) 两个参数中的最大值 (The maximum numeric value of its arguments. Values among which the function selects a maximum )

fmin(x, y) 两个参数中的最小值

幂函数

pow(base, power) 幂函数 The result of raising base to the power exponent

sqrt(x) 计算x的平方根

cbrt(x) 计算x的立方根

对数函数

log(x) x的自然对数 (Natural logarithm of x)

提升效率代码

这两串代码可以提升c++运行效率,节省时间

ios::sync_with_stdio(0);

cin.tie(0);

vector容器(相当于集合一类)

vector详解:

empty()可以判断vector是否为空
push_back()每次会添加一个元素到vector的末尾
begin()​:返回向量头指针,指向第一个元,如果要取第一位数需要加个,比如:变量名.beign()才是集合中的第一位数。
back()​:返回尾元素的引用
clear()​:清空向量中所有元素
max_size() const​:返回最大可允许的 vector 元素数量值

————————————————
版权声明:本文为CSDN博主「~不羁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_62870588/article/details/123710633

取得一串数字头尾数字,以及14届蓝桥杯B组D题有感

   	int A;cin>>A;//目标数字
	    vector<int> d;//创建集合,取得一个数字的头尾两数
	    while(A){
	    	d.push_back(A%10);//取得末尾个位数,每次循环将上一位数存入集合末尾,存到最后一位数就是第一个数字
	    	A/=10;
		}
		int first=d.back(), last=*d.begin();
  • 蓝桥杯E题详解

【问题描述】
对于一个长度为 K 的整数数列:A1, A2, . . . , AK,我们称之为接龙数列当且
仅当 Ai 的首位数字恰好等于 Ai−1 的末位数字 (2 ≤ i ≤ K)。
例如 12, 23, 35, 56, 61, 11 是接龙数列;12, 23, 34, 56 不是接龙数列,因为 56
的首位数字不等于 34 的末位数字。所有长度为 1 的整数数列都是接龙数列。
现在给定一个长度为 N 的数列 A1, A2, . . . , AN,请你计算最少从中删除多少
个数,可以使剩下的序列是接龙序列?
【输入格式】
第一行包含一个整数 N。
第二行包含 N 个整数 A1, A2, . . . , AN。
【输出格式】
一个整数代表答案。
【样例输入】
5
11 121 22 12 2023
【样例输出】
1
【样例说明】
删除 22,剩余 11, 121, 12, 2023 是接龙数列。

#include<bits/stdc++.h>
using namespace std;
int N;
long int N_max=1e6;
int dp[10];
int main(){
	ios::sync_with_stdio(0);cin.tie(0);//节省时间,提高运行效率的代码
    cin>>N;
    for(int i=0;i<N;i++){
    	int A;cin>>A;
	    vector<int> d;
	    while(A){
	    	d.push_back(A%10);
	    	A/=10;
		}
		int first=d.back(), last=*d.begin();
		dp[last]=max(dp[last],dp[first]+1); //奇特解题思路,每次让第Ai个数比较其高位与上一位数得低位,如果相同就加一,最后得合即为符合条件得数字。用全部得数字减去这个合即为不符合条件得数字得个数。
   }
   int len=0;
   for(int i=0;i<10;i++) len=max(len,dp[i]);
   cout<<N-len;		
	return 0;
}

14届蓝桥杯G字串简写题收获:C++对字符串的操作,以及该题思考方式

C++字符串知识:

string S;//创建字符串
S.size()//返回字符串的长度。
S[]//可以用下标操作字符串

  • G题详解:
    程序猿圈子里正在流行一种很新的简写方法:对于一个字符串,只保留首
    尾字符,将首尾字符之间的所有字符用这部分的长度代替。例如 internationalization 简写成 i18n,Kubernetes (注意连字符不是字符串的一部分)简
    写成 K8s, Lanqiao 简写成 L5o 等。
    在本题中,我们规定长度大于等于 K 的字符串都可以采用这种简写方法
    (长度小于 K 的字符串不配使用这种简写)。
    给定一个字符串 S 和两个字符 c1 和 c2,请你计算 S 有多少个以 c1 开头
    c2 结尾的子串可以采用这种简写?
    【输入格式】
    第一行包含一个整数 K。
    第二行包含一个字符串 S 和两个字符 c1 和 c2。
    【输出格式】
    一个整数代表答案。
    【样例输入】
    4
    abababdb a b
    【样例输出】
    6
    【样例说明】
    符合条件的子串如下所示,中括号内是该子串:
    试题G: 子串简写 13
    第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组
    [abab]abdb
    [ababab]db
    [abababdb]
    ab[abab]db
    ab[ababdb]
    abab[abdb]
    【评测用例规模与约定】
    对于 20% 的数据,2 ≤ K ≤ |S | ≤ 10000。
    对于 100% 的数据,2 ≤ K ≤ |S | ≤ 5 × 105。S 只包含小写字母。c1 和 c2 都
    是小写字母。
    |S | 代表字符串 S 的长度。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
string S;
int K;
char c1,c2;
int main(){
	cin>>K>>S>>c1>>c2;
	int n=S.size();
	int sum=0;
	LL ans =0;
	for(int i=K-1,j=0;i<n;i++,j++){//for循环中,设置两个变量,两个变量之间有k-1个跨度,i寻找字符c2,j寻找字符c1
		if(S[j]==c1){          //该题逆向思考,通过寻找c2(b),对应多少c1(a)
			sum++;         //当找到一个c1(a) 时,我们令sum++,当找到一个符合的c2(b) 时我们就将ans+=sum,意味着将当前这个b对应着的所有的a的个数收集起来,依次类推,每个b都是如此,我们便得到了结果ans
		}
		if(S[i]==c2){
			ans+=sum;
		}
	}
	cout<<ans;
	return 0;
}