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

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

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

文章目录

  • 1.阶乘之和
  • 2.生活大爆炸版石头剪刀布

1.阶乘之和

  • 题目

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

    输入一个正整数 n

    输出描述

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

    输入输出样例

    示例 1

    输入

    3
    

    输出

    9
    
  • 第一次 AC 100%

    #include
    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 集中出现了一种石头剪刀布的升级版游戏。

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

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

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

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

    蓝桥杯刷题冲刺 | 倒计时9天_第1张图片

    现在,小 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
    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 
    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;
    }
    

Alt

你可能感兴趣的:(蓝桥杯倒计时冲刺,蓝桥杯,c++,算法)