模拟
基本概念
题目怎么说,你就照着怎么做,比较简单的可以大力枚举,难一些的可能需要优化。
一些比较复杂的模拟题,需要注意变量的命名,如果命名过于混乱,不含任何含义,很有可能写到后面就不记得每个变量的含义。良好的命名习惯加上适当的注释,在逻辑比较复杂的题目中会有很好的效果。
来道例题
在一根电线上落有 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进制上的最低位的权重是,次低位的权重是
,以此类推,次k低位的权重是
。
高精度
啥是高精度
在某些题目中可能需要用到很大的整数变量,大到long long甚至int 128这些整数类型都存不下,这时我们就需要高精度。其本质就是用数组模拟一个大整数。
我们一般用数组的第一位存储整数的最低位,第二位存次低位,以此类推,第k位存第k低位。
来道例题
给出两个非负整数,求它们的乘积。每个非负整数不超过 。
很显然,这是道高精度模板题。
•思路:高精度乘法。
•步骤:高精度乘法。
#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;
}