#include<stdio.h>
int main()
{
int i,j,L,a[2],b[10001],M,count=0;
scanf("%d%d",&L,&M);
for(i=0;i<=L;i++)
b[i]=0;
for(i=1;i<=M;i++){
for(j=0;j<2;j++)
scanf("%d",&a[j]);
for(j=0;j<=L;j++)
if(j>=a[0]&&j<=a[1]) b[j]=1;
}
for(i=0;i<=L;i++)
if(b[i]==0) count++;
printf("%d",count);
return 0;
}
#include <stdio.h> int main() { int l,m; //l存储马路的长度,m存储区域的数目 int u,v; //u,v分别用来存储区域的起点和终点 int i,j; int cnt = 0; scanf("%d%d",&l,&m); //输入马路的长度和区域的数目 int tree[l]; //定义数组用来存储路上所有的树 //遍历马路上所有的树 for(i=0; i<=l; i++) { tree[i] = 0; //把所有的树标记为 0 } for(i=0; i<m; i++) { scanf("%d%d",&u,&v); for(j=u; j<=v; j++) { tree[j] = 1; //所有区域内的树标记为 1 } } //遍历整个数组,未标记为1的,计数加一 for(i=0; i<=l; i++) { if(tree[i]!=1) cnt++; } printf("%d",cnt); return 0; }
以上为洛谷P1047校园外的树的源码
关键:①以for循环中J的范围为工具展开大规模的遍历查找(有效的解决了重复的问题)
注意事项:如book[n],在最后的请点中,如for(i=0;i<l;i++) count+=book[i];一旦写成i<=l数组越界但编译器不报错,输出一个极其离谱的天文数字!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
精简后的代码如下:①关键while(a--)表示循环会指向a次。【即不需要考虑那些杂七杂八的范围啥的,也不容易让读代码的人被那么多的for绕晕 】
#include<stdio.h>
int main()
{
int l,m;
scanf("%d%d",&l,&m);
int u,v,sum;
int a[l]={0};
while(m--)
{
scanf("%d%d",&u,&v);
for(int j=u;j<=v;j++)
a[j]=1;
}
for(int j=0;j<l;j++)
sum+=a[j];
printf("%d",l+1-sum);
return 0;
}
二,工艺品
#include<stdio.h>
int main()
{
int w,x,h,sum=0,q;
int x1,y1,z1,x2,y2,z2;
int a[21][21][21]={0};
int i,j,k,l;
scanf("%d%d%d%d",&w,&x,&h,&q);
while(q--)
{
scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
for(i=x1;i<=x2;i++)
for(j=y1;j<=y2;j++)
for(k=z1;k<=z2;k++)
a[i][j][k]=1;
}
for(i=1;i<=w;i++)
for(j=1;j<=x;j++)
for(k=1;k<=h;k++)
if(a[i][j][k]==0)
sum++;
printf("%d",sum);
return 0;
}
两道题的总结:1一维去重:建立一维数组 体现:线段;街道上的树
2二维去重:体现:矩阵表
3三维去重:体现:立方体积木.........