20250722 模拟,进制 and 高精度

模拟

基本概念

题目怎么说,你就照着怎么做,比较简单的可以大力枚举,难一些的可能需要优化。

一些比较复杂的模拟题,需要注意变量的命名,如果命名过于混乱,不含任何含义,很有可能写到后面就不记得每个变量的含义。良好的命名习惯加上适当的注释,在逻辑比较复杂的题目中会有很好的效果。

来道例题

B4294 [蓝桥杯青少年组国赛 2022] 电线上的小鸟

          在一根电线上落有 N 只小鸟,每只小鸟的朝向要么向左(用 q 表示),要么向右(用 p 表      示)。每只小鸟只能看到它视线方向上的相邻小鸟。给定 N 只小鸟的朝向序列,请计算:

        有多少只小鸟没有被任何小鸟看到(被 0 只小鸟看到);

        有多少只小鸟被 1 只小鸟看到;

        有多少只小鸟被 2 只小鸟看到。

  例如:当 N=6,朝向序列为 p q p p q q 时:

         有 2 只小鸟被 0 只小鸟看到(第 3 只和第 6 只);

         有 2 只小鸟被 1 只小鸟看到(第 1 只和第 2 只);

         有 2 只小鸟被 2 只小鸟看到(第 4 只和第 5 只)。

很显然,是道模拟水题,废话不多说,浅浅的解析一下吧。

•思路:有两种思路。一、依次枚举查看左右有几只鸟在瞅你;二、以此枚举查看你在瞅哪只鸟。

•步骤一:

1.用char or bool数组接入数据。

2.for循环判断旁边有几只鸟在瞅你,用三个变量统计。

3.最后依次输出结果。

•代码一:

#include<bits/stdc++.h>
using namespace std;
bool f[1005];
//char a[1005];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        char x;
        cin>>x;
        //cin>>a[i];
        if(x=='p'){
            f[i]=1;
        }
    }
    int s0=0,s1=0,s2=0;
    for(int i=1;i<=n;i++){
        int s=0;
        if(f[i-1])s++;          //if(a[i-1]=='p')
        if(!f[i+1])s++;         //if(a[i+1]=='q')
        if(s==0)s0++;
        if(s==1)s1++;
        if(s==2)s2++;
    }
    cout<<s0<<" "<<s1<<" "<<s2; 
    return 0;
}

 •步骤二:

1.接入数据。

2.for循环判断你在瞅哪只鸟,就在哪只鸟的下标++。

3.用三个变量统计旁边有几只鸟在瞅你,最后输出。

•代码二:

#include<bits/stdc++.h>
using namespace std;
int a[1005];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        char x;
        cin>>x;
        if(x=='p'){
            a[i+1]++; 
        }else{
            a[i-1]++;
        }
    }
    int s0=0,s1=0,s2=0;
    for(int i=1;i<=n;i++){
        if(a[i]==0)s0++;
        if(a[i]==1)s1++;
        if(a[i]==2)s2++;
    }
    cout<<s0<<" "<<s1<<" "<<s2; 
    return 0;
}

进制

十进制和二进制

我们在日常生活中往往使用十进制,这是因为人类恰好有十根手指不然我们早就成外星人了,可以方便的数出1到10。但是对电脑来说,十进制太复杂了,它只能用高低电平(1和0)来理解二进制。

十进制对人类友好
二进制对电脑友好
进制转换

所谓"进制",其本质就是"逢X进一",如十进制就是逢十进一,十进制里每一位都是0到9,某一位上一定不会出现"十";同理,二进制是逢二进一,每一位都是0或1,每一位都一定不会出现"2"。

因为X进制"逢X进一"的特点,X进制上的最低位的权重是X^0,次低位的权重是X^{1},以此类推,次k低位的权重是X^{k-1}

高精度

啥是高精度

在某些题目中可能需要用到很大的整数变量,大到long long甚至int 128这些整数类型都存不下,这时我们就需要高精度。其本质就是用数组模拟一个大整数。

我们一般用数组的第一位存储整数的最低位,第二位存次低位,以此类推,第k位存第k低位。

来道例题

P1303 A*B Problem

给出两个非负整数,求它们的乘积。每个非负整数不超过10^{2000} 。

很显然,这是道高精度模板题。

•思路:高精度乘法。

•步骤:高精度乘法。

#include<bits/stdc++.h>
using namespace std;
long long a[2005],b[2005],c[4005];
int main(){
	string s1,s2;
	cin>>s1>>s2;
	int l1=s1.size();
	int l2=s2.size();	
	for(int i=l1-1;i>=0;i--){
		a[i]=s1[l1-i-1]-'0';
	}
	for(int i=l2-1;i>=0;i--){
		b[i]=s2[l2-i-1]-'0';
	}
	for(int i=0;i<l1;i++){
		for(int j=0;j<l2;j++){
			c[i+j]+=a[i]*b[j];
		}
	}
	int l=l1+l2;
	for(int i=0;i<l;i++){
		c[i+1]+=c[i]/10;
		c[i]%=10;
	}
	while(c[l]==0)l--; 
	if(l<0){
		cout<<0;
		return 0;
	}
	for(int i=l;i>=0;i--){
		cout<<c[i];
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值