目录
2023.8.27——洛谷题单——数组
P1161 开灯
(1)float和double
double是双精度浮点数,内存占8个字节,有效数字16位,表示范围是-1.79E+ 308~-1.79E+308。
float是单精度浮点数,内存占4个字节,有效数字8位,表示范围是 -3.40E+38~3.40E+38。
(2)错误点
for循环里约束条件的数偏小了
可以直接这样写:(无约束条件)
for(int i=1;;i++)
循环里面用break跳出。
最终代码:
#include<iostream>
using namespace std;
int con[2000000];
int main(){
int n;
cin>>n;
double a; //这里最开始用的float,出错了
int t;
int i,j;
for(i=1;i<=n;i++){
cin>>a>>t;
for(j=1;j<=t;j++){
//按一下开关,状态(0或1)就改变一次
if(con[int(a*j)]==1) con[int(a*j)]=0;
else con[int(a*j)]=1;
}
}
for(i=1;;i++){ //这里最开始写的是for(i=0;i<2000;i++)就出错了
if(con[i]==1) {
cout<<i;
break;
}
}
}
P5731 蛇形方阵
(1)如何实现蛇形
用四个while循环,按照右下左上的顺序,碰到边界或者已填就改变方向(进入下一个while循环)。
(2)错误点
到底应该是 --i 还是 i--
正确代码如下:
#include<iostream>
using namespace std;
int a[15][15];
int main(){
int n;
cin>>n;
int k=1;
int i=1,j=0;
while(k<=n*n){
//四个while循环实现右下左上
while(!a[i][j+1]&&j<n) a[i][++j]=k++; //这里最开始写的是j++,就错了
while(!a[i+1][j]&&i<n) a[++i][j]=k++;
while(!a[i][j-1]&&j>1) a[i][--j]=k++;
while(!a[i-1][j]&&i>1) a[--i][j]=k++;
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%3d",a[i][j]);
}
printf("\n");
}
}
P1789 插火把
易错点
忽略了数组的边界。若i=1,则 i-2=-1 越界了。
由于火把或萤火照亮的范围是对称的,所以此时可用abs()函数取绝对值。
正确代码:
#include<iostream>
#include<cmath>
using namespace std;
int a[110][110];
int n,m,k;
//返回怪物(没有光的地方)的个数
int monster(){
int i,j,sum=0;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(a[i][j]==0) sum++;
}
}
return sum;
}
//火把周围变成1
void ok_huo(int m,int n){
int i,j;
for(i=m,j=abs(n-2);j<n+3;j++){
a[i][j]=1;
}
for(i=abs(m-2),j=n;i<m+3;i++){
a[i][j]=1;
}
a[abs(m-1)][abs(n-1)]=1; a[m+1][abs(n-1)]=1;
a[abs(m-1)][n+1]=1; a[m+1][n+1]=1;
}
//萤石周围变成1
void ok_ying(int m,int n){
int i,j;
for(i=m-2;i<m+3;i++){
for(j=n-2;j<n+3;j++){
a[i][j]=1;
}
}
}
int main(){
cin>>n>>m>>k;
int i,j;
int x,y; //火把位置
int o,p; //萤石位置
for(i=0;i<m;i++){
cin>>x>>y;
ok_huo(x,y);//火把周围变成1
}
for(i=0;i<k;i++){
cin>>o>>p;
ok_ying(o,p);//萤石周围变成1
}
int result=monster();
cout<<result;
}
P1319压缩技术
易错点
见下方代码:
#include<bits/stdc++.h>
using namespace std;
int N;//方阵行数和列数
int num[250][250];
//输出数组
void show(){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
cout<<num[i][j];
}
cout<<endl;
}
}
int main(){
cin>>N;
int sum=0;
int a;
int flag=1,f;
int i=0,j=-1;
while(sum<N*N){
cin>>a;
sum+=a;
if(flag<0) f=1;
else f=0;
flag*=-1;
while(a>0){
if(j<N-1) j++;
else{
i++;
j=0;
}
num[i][j]=f;
a--;
}
}
show(); //输出数组
}