萌新求助

P1047 [NOIP2005 普及组] 校门外的树

#include<iostream> using namespace std; int L,M,cnt,vis[10000+10],head,tail; int main(){ cin>>L>>M; for(int i=1;i<=M;i++){ cin>>head>>tail; for(int j=head;j<=tail;j++)if(vis[j]==0)vis[j]=1; } for(int i=0;i<=L;i++)if(vis[i]==0)cnt++; cout<<cnt<<endl; return 0; }
by fzhfzh @ 2019-05-26 10:11:42


``` #include<iostream> using namespace std; int L,M,cnt,vis[10000+10],head,tail; int main(){ cin>>L>>M; for(int i=1;i<=M;i++){ cin>>head>>tail; for(int j=head;j<=tail;j++)if(vis[j]==0)vis[j]=1; } for(int i=0;i<=L;i++)if(vis[i]==0)cnt++; cout<<cnt<<endl; return 0; } ```
by fzhfzh @ 2019-05-26 10:11:50


希望更丰富的展现?使用Markdown
by 我不认识你 @ 2019-05-26 10:12:05


23333
by 1saunoya @ 2019-05-26 10:12:26


这是本人的代码,可供参考~ ``` #include <iostream> using namespace std; int q[10001]; //初始化数组(因为题目限制是10000,所以10001就够了,不放心的可以设多一点也无妨) int main() { int a,b,c,d,e=0; //分别初始化马路的长度(a)、区域的数目(b)、一个区域的起始点坐标(c)、终止点的坐标(d) cin>>a>>b; //获取马路的长度及区域的数目 for(int i=0;i<b;i++) //当i小于b时执行循环 { cin>>c>>d; //获取一个区域的起始点和终止点的坐标 for(int j=c;j<=d;j++) //双重嵌套循环 { if(q[j]==0) //当q[j]==0时将其设定为1,并将e的值加1 { q[j]=1; e++; } } } cout<<a-e+1<<endl; //输出结果 return 0; //结束程序 } ```
by Stephen_Curry @ 2019-05-26 10:19:37


@[a1632684023](/space/show?uid=200235) 首先,记得下次发代码要上下加上 ```markdown "```" "```" ``` ,否则会看不清代码(不要加引号) 然后大数组尽量开到函数外面,以防RE (全局数组可以开大点,但是不能在函数内部用auto大数组) 然后可以在输入区间的时候处理砍树(如下) ``` for (int i=1;i<=areaNumber;i++) { int left,right; cin>>left>>right; for (int j=left;j<=right;j++) { Length[j]=0;//不需要判断 } } ``` 然后数组名字尽量不要用`array`,可能会和STL之类的重复 最后就是统计的时候直接让`number+=Length[i]`即可, 因为如果是0,那么就没有累加,是1,就累加上了。 最后放上原先的代码和现在改完了的代码。 原代码: ```cpp #include <iostream> using namespace std; int main() { int length, areaNumber; cin >> length >> areaNumber; int number = 0; int array[areaNumber][2]; int Length[length]; for (int i = 0; i <= length; i++) Length[i] = 1; for (int i = 0; i < areaNumber; i++) { for (int j = 0; j < 2; j++) cin >> array[i][j]; } for (int i = 0; i < areaNumber; i++) { for (int j = array[i][0]; j <= array[i][1]; j++) { if (Length[j] == 1) Length[j] = 0; } } for (int i = 0; i <= length; i++) { if (Length[i] == 1) number++; } cout << number << endl; return 0; } ``` 现在的代码: ```cpp #include <iostream> using namespace std; int main() { int length, areaNumber; cin >> length >> areaNumber; int number = 0; int array[areaNumber][2]; int Length[length]; for (int i = 0; i <= length; i++) Length[i] = 1; for (int i = 1; i <= areaNumber; i++) { int left_point, right_point; cin >> left_point >> right_point; for (int j = left_point; j <= right_point; j++) { Length[j] = 0; } } for (int i = 0; i <= length; i++) number += Length[i]; cout << number << endl; return 0; } ``` 不谢qwq
by Jelly_Goat @ 2019-05-26 10:36:57


@[Jelly_Goat](/space/show?uid=122927) ###### 十分感谢
by a1632684023 @ 2019-05-26 10:50:26


@[Stephen_Curry](/space/show?uid=212267) ###### 谢谢了
by a1632684023 @ 2019-05-26 10:56:53


@[fzhfzh](/space/show?uid=158050) ###### 感谢
by a1632684023 @ 2019-05-26 10:57:18


|