蓝桥杯刷题冲刺 | 倒计时8天

Posted 指针不指南吗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯刷题冲刺 | 倒计时8天相关的知识,希望对你有一定的参考价值。

作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺

🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾

文章目录

1.三角形的面积

  • 题目

    链接: 三角形的面积 - 蓝桥云课 (lanqiao.cn)

    平面直角坐标系中有一个三角形, 请你求出它的面积。

    输入描述

    第一行输入一个 T ,代表测试数据量

    每组测试数据输入有三行,每行一个实数坐标 (x,y) 代表三角形三个顶点。

    1≤T 1 0 3 10^3 103 ,− 1 0 5 10^5 105x,y 1 0 5 10^5 105

    输出描述

    输出一个实数表示三角形面积。结果保留2位小数,误差不超过 1 0 − 2 10^-2 102

    输入输出样例

    示例 1

    输入

    2
    0 1
    1 0
    1 1
    0 0
    1 1
    2 2
    

    输出

    0.50
    0.00
    
  • 第一次 AC 100% 坐标公式

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    
    	int n;
    	cin>>n;
    	
    	double x1,y1,x2,y2,x3,y3;
    	double S;
    	
    	while(n--)
    	
    		cin>>x1>>y1>>x2>>y2>>x3>>y3;  //公式背过
    		S=fabs(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)*1.0/2;  //这里,abs的使用,面积没有负的
    		printf("%.2f\\n",S);
    	
    	
    	return 0;
      
    
  • 题解二 海伦公式----边长

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    
    	int n;
    	cin>>n;
    	
    	long double x1,y1,x2,y2,x3,y3;
    	long double a,b,c;
    	long double S;
    	
    	while(n--)
    	
    		cin>>x1>>y1>>x2>>y2>>x3>>y3;
    		
    		//算出来 三个边长 
    		long double a=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
    		long double b=sqrt(pow(x1-x3,2)+pow(y1-y3,2));
    		long double c=sqrt(pow(x2-x3,2)+pow(y2-y3,2));
    		
    		//海伦公式 
    		long double p=(a+b+c)/2;
    		
    		S=sqrt(p*(p-a)*(p-b)*(p-c));   //背过
    		
    		printf("%.2Lf\\n",S);  //这里,输出 Lf
    	
    	
    	return 0;
      
    

    double 竟然不能用,使用 long doule 才可以

    double占用8个字节,long double占用16个字节,因此long double的精度更高,但也会占用更多的内存空间。

    一般使用double就可以满足需求,只有在需要更高精度的计算时才会使用long double。

    long double 输出用%Lf

    这个题为什么用 long double 记住就行 T-T

  • 反思

    1. 把三角形的公式搞定
    2. 输出格式,\\n以及有小数点的限制,注意!!
    3. 绝对值 整数时,使用 abs;浮点数,使用 fabs
    • 上述两种方法,一个边长,一个坐标,应该解决三角形面积就够了

2.图中点的层次

  • 题目

    链接: 847. 图中点的层次 - AcWing题库

    给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。

    所有边的长度都是 1,点的编号为 1∼n。

    请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。

    输入格式

    第一行包含两个整数 n 和 m。

    接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1 的边。

    输出格式

    输出一个整数,表示 1 号点到 n 号点的最短距离。

    数据范围

    1≤n,m≤ 1 0 5 10^5 105

    输入样例:

    4 5
    1 2
    2 3
    3 4
    1 3
    1 4
    

    输出样例:

    1
    
  • 第一次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=1e5+10;
    
    int n,m;
    int h[N],e[N],ne[N],idx;
    int d[N];
    
    void add(int a,int b)
    
        e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    
    
    int bfs()
    
        memset(d,-1,sizeof d);
        d[1]=0;
        
        queue<int>  q;
        q.push(1);
        
        while(q.size())
        
            int t=q.front();
            q.pop();
            
            for(int i=h[t];i!=-1;i=ne[i])
            
                int j=e[i];
                if(d[j]==-1)
                
                    d[j]=d[t]+1;
                    q.push(j);
                
            
        
        return d[n];
    
    
    int main()
    
        cin>>n>>m;
        
        memset(h,-1,sizeof h);  //!!!!!!!!!! 记得写上
        
        while(m--)
        
            int a,b;
            cin>>a>>b;
            add(a,b);
        
        
        cout<<bfs();
        
        return 0;
    
    
  • 反思

    写一道模板题水一下,不定时复习暴搜

    使用邻接表的时候 h 初始化 + add ,初始化别丢

蓝桥杯刷题冲刺 | 倒计时9天

作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺

🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾

文章目录

1.阶乘之和

  • 题目

    链接: 阶乘之和 - 蓝桥云课 (lanqiao.cn)

    输入一个正整数 n

    输出描述

    输出一个正整数 S,表示计算结果。

    输入输出样例

    示例 1

    输入

    3
    

    输出

    9
    
  • 第一次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    vector<int> mul(vector<int> A,int b)
    
    	vector<int> C;
    	
    	int t=0;
    	for(int i=0;i<A.size()||t;i++)  //或上 t ,来处理 最后 t 还有进位的情况
    	
    		if(i<A.size()) t+=A[i]*b;  //这里注意
    		C.push_back(t%10);
    		t/=10;
    	
    	
    	while(C.size()>1&&C.back()==0)	C.pop_back();  //记得处理前导0
    	
    	return C;
    
    
    vector<int> add(vector<int> A,vector<int> B)
    
    	vector<int> C;
    	
    	if(A.size()<B.size()) return add(B,A);
    	
    	int t=0;
    	for(int i=0;i<A.size();i++)
    	
    		t+=A[i];
    		if(i<B.size()) t+=B[i];  //注意这里
    		C.push_back(t%10);
    		t/=10;
    	
    	
    	if(t) C.push_back(1);  //处理最后进位
    	
    	return C;
    
    
    int main()
    
    	int n;
    	
    	cin>>n;
    	
    	vector<int> res;
    	vector<int> sum;
    	sum.push_back(1);  //初始化
    	
    	for(int k=2;k<=n;k++)
    	
    		res.clear();   //每次都是需要 清空的
    		res.push_back(1);
    		
    		for(int i=2;i<=k;i++)  //计算单个阶乘 
    		
    			res=mul(res,i);
    		
    		
    		sum=add(sum,res);  //高精度加法
    	
    	
    	for(int i=sum.size()-1;i>=0;i--)	printf("%d",sum[i]);
    	
    	return 0;
      
    
  • 阶乘

    从13!开始就开始爆int

    从21!开始就开始爆 long long

    正好算阶乘 int 可以算到 十二, long long 可以算到 二十,十二和二十 正好便于记忆

  • 反思

    高精度乘法,注意把 比较小的数 存成 int ,不要也一起存成 string ,虽然这次没有涉及到

    • 这个就是标准的 模板题

2.生活大爆炸版石头剪刀布

  • 题目

    链接:https://www.luogu.com.cn/problem/P1328

    石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。

    升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势:

    斯波克:《星际迷航》主角之一。

    蜥蜴人:《星际迷航》中的反面角色。

    这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。

    现在,小 A 和小 B 尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有周期性规律的,但周期长度不一定相等。例如:如果小 A 以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为 6 6 6 的周期出拳,那么他的出拳序列就是“石头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头-剪刀-蜥蜴人-斯波克-…”,而如果小 B 以“剪刀-石头-布-斯波克-蜥蜴人”长度为 5 5 5 的周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布-斯波克-蜥蜴人-…”

    已知小 A 和小 B 一共进行 N N N 次猜拳。每一次赢的人得 1 1 1 分,输的得 0 0 0 分;平局两人都得 0 0 0 分。现请你统计 N N N 次猜拳结束之后两人的得分。

    输入格式

    第一行包含三个整数: N , N A , N B N,N_A,N_B N,NA,NB,分别表示共进行 N N N 次猜拳、小 A 出拳的周期长度,小 B 出拳的周期长度。数与数之间以一个空格分隔。

    第二行包含 N A N_A NA 个整数,表示小 A 出拳的规律,第三行包含 N B N_B NB 个整数,表示小 B 出拳的规律。其中, 0 0 0 表示“剪刀”, 1 1 1 表示“石头”, 2 2 2 表示“布”, 3 3 3 表示“蜥蜴人”,$4 $表示“斯波克”。数与数之间以一个空格分隔。

    输出格式

    输出一行,包含两个整数,以一个空格分隔,分别表示小 A、小 B 的得分。

    样例输入1

    10 5 6
    0 1 2 3 4
    0 3 4 2 1 0
    

    样例输出1

    6 2
    

    样例

    例输入 2

    9 5 5
    0 1 2 3 4
    1 0 3 2 4
    

    样例输出 2

    4 4
    

    提示

    对于 100 % 100\\% 100%的数据, 0 < N ≤ 200 , 0 < N A ≤ 200 , 0 < N B ≤ 200 0 < N \\leq 200, 0 < N_A \\leq 200, 0 < N_B \\leq 200 0<N200,0<NA200,0<NB200

  • 第一次

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=210;
    
    
    bool check(int a[N],int b[N],int i,int j)
    
    	if(a[i]==0&&(b[j]==1||b[j]==4)) 	return false;  //表示aa输 
    	if(a[i]==0&&(b[j]==2||b[j]==3))  return true;
    	if(a[i]==1&&(b[j]==2||b[j]==4))  return false;
    	if(a[i]==1&&b[j]==3) return true;
    	if(a[i]==2&&b[j]==3) return false;
    	if(a[i]==2&&b[j]==4) return true;
    	if(a[i]==3&&b[j]==4) return true;
    
    
    int main()
    
    	int n,x,y;
    	cin>>n>>x>>y;
    	
    	int a[N]=0,b[N]=0;
    	
    	int aa=0,bb=0;
    	
    	for(int i=0;i<x;i++)  cin>>a[i];
    	for(int i=0;i<y;i++)  cin>>b[i];
    	
    	int i=0,j=0;
    	
    	while(n--)
    	
    		if(i==x) i=0;
    		if(j==y) j=0;
    		
    		if(a[i]==b[j]) continue;
    		
    		if(check(a,b,i,j)) aa++;
    		if(check(b,a,i,j)) bb++;
    		
    		i++;
    		j++;
    	
    	
    	cout<<aa<<' '<<bb;
    	
    	return 0;
    
    
  • 正确题解

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 200 + 10;
    int n, na, nb, a[MAXN], b[MAXN], cnta, cntb;
    int vs[5][5] = 0,0,1,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,1,1,0,0,0; //得分表的处理 
    int main()
    
        cin >> n >> na >> nb;
        for(int i = 0; i < na; i++) cin >> a[i];
        for(int i = 0; i < nb; i++) cin >> b[i];
        for(int i = 0; i < n; i++)
        
            cnta += vs[a[i % na]][b[i % nb]]; //周期循环 
            cntb += vs[b[i % nb]][a[i % na]];
        
        cout << cnta << " " << cntb << endl;
        return 0;
    
    

以上是关于蓝桥杯刷题冲刺 | 倒计时8天的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯刷题冲刺 | 倒计时9天

蓝桥杯刷题冲刺 | 倒计时16天

蓝桥杯刷题总结(省)

蓝桥杯刷题

蓝桥杯刷题

蓝桥杯刷题