C言語配列問題_校門の外の木マーキングほう
タイトルの説明
ある校門の外の長さLの道路には木が並んでいて、2本の隣接する木の間の間隔は11メートルです.私たちは道路を1つの数軸と見なすことができて、道路の一端は数軸00の位置にあって、もう一端はLLの位置にあります;数軸上の各整数点、すなわち0,1,2,...,L 0,1,2,...,Lには、木が植えられている.
道路には地下鉄を建設するための地域があるからです.これらの領域は、数軸上の開始点と終了点で表されます.任意の領域の始点と終点の座標が整数であることが知られており、領域の間に重複する部分がある可能性がある.これらの領域のツリー(領域の端点にある2本のツリーを含む)を移動します.あなたの任務は、これらの木を全部移した後、道路に何本の木があるかを計算することです.
問題を解く構想.
ちょうどテーマを見ると、この配列の問題は重なり合う部分の処理を重点的に考察し、2つの建設区域を例にとると、3つの状況にほかならないと思います.2:2つが重なる(1つが別のものに含まれる);3:部分的に重なる.最初は単純に状況ごとに並べて重ねた部分の木の数を減算すれば済むと思っていたが、これは非常に複雑だった.
この問題の最善の方法は、まず1つの配列を確立し、そのすべての要素を「1」にし、各建設区域内の値を「0」に変更することで、重なる部分でも木を多く減算する心配はありません.
コード#コード#
ある校門の外の長さLの道路には木が並んでいて、2本の隣接する木の間の間隔は11メートルです.私たちは道路を1つの数軸と見なすことができて、道路の一端は数軸00の位置にあって、もう一端はLLの位置にあります;数軸上の各整数点、すなわち0,1,2,...,L 0,1,2,...,Lには、木が植えられている.
道路には地下鉄を建設するための地域があるからです.これらの領域は、数軸上の開始点と終了点で表されます.任意の領域の始点と終点の座標が整数であることが知られており、領域の間に重複する部分がある可能性がある.これらの領域のツリー(領域の端点にある2本のツリーを含む)を移動します.あなたの任務は、これらの木を全部移した後、道路に何本の木があるかを計算することです.
問題を解く構想.
ちょうどテーマを見ると、この配列の問題は重なり合う部分の処理を重点的に考察し、2つの建設区域を例にとると、3つの状況にほかならないと思います.2:2つが重なる(1つが別のものに含まれる);3:部分的に重なる.最初は単純に状況ごとに並べて重ねた部分の木の数を減算すれば済むと思っていたが、これは非常に複雑だった.
この問題の最善の方法は、まず1つの配列を確立し、そのすべての要素を「1」にし、各建設区域内の値を「0」に変更することで、重なる部分でも木を多く減算する心配はありません.
コード#コード#
#include
#include
int main()
{
int l,m,count=0,i,j;
int a[101][2],lu[10001]={
'\0'}; //a ; lu
scanf("%d %d",&l,&m);
for(i=0;i<l+1;i++)
lu[i]=1; //l , 1 , l+1, ‘1’
for(i=0;i<m;i++)
{
scanf("%d %d",&a[i][0],&a[i][1]); // m
}
for(i=0;i<m;i++)
{
for(j=a[i][0];j<=a[i][1];j++)
{
lu[j]=0; // ‘0’,
}
}
for(i=0;i<l+1;i++)
if(lu[i]==1)
count++; // lu, '1' ,
printf("%d",count);
}