这时我第一次更学习心得!不足的在评论区指教。
首先先来分享一下,刷一维数组题目的方法。
仔细读题,不会做的题目先完成输入输出。不要干等着着急,就跳到下一题。如果使用的时oj,那就没有题解但是使用洛谷、LeetCood就有题解。可是你千万不要去看,一定要自己思考。实在是不知道怎么做了才可以去看!而且,不要做完一道题就立刻去刷下一道题除非你是自己做出来的。否则的话刷在多题也没有用!要理解这道题目的意思和解法,尝试这理解别人题解写的代码所用的思考方式。这样就可以达到,刷一题抵十题的效果!
要学会思考!下面我们看一道题目。一起来思考一下。跟着我的思路来!
校门外的树
这道题我讲过但是由于十分经典算法涉及到了模拟。所以在讲一遍!
遇到这类题型我们可以先画图分析一下,至少可以让我们对题目不那么模糊。
可以看到这个图刚好符合题目的要求!1、这条路的长度是0---l 2、n个区块的树要移走
3、有区域重合!
这道题是可以算出来的,但是有些人会算错,就算对了也只是符合这一组样例数据罢了。这个时候就要用到数组的特性来解题了!我们可以将移走的树设为1,没有被移走的树设为0。最后把是0的数组元素累加起来,最后输出就可以了。
但是每个要移走树区块的起始点和终点该如何解决,我们可以定义两个变量,x和y。x是要移走树的区块的起始点,y是要移走树的区块的终点。而n就是有n个要移走树的区块,这里就需要用到for嵌套
#include<cstdio> int a[50857],l,n,sum,x,y; int main(){scanf("%d %d",&l,&n);for(int i=1;i<=n;i++){scanf("%d %d",&x,&y);for(int i=x;i<=y;i++){a[i]=1;}}for(int i=0;i<=l;i++){if(a[i]==0){sum++;}}printf("%d",sum); }
注意的是i是从0开始的。
讲了这么久,就是为了让大家知道。要独立思考,灵活运用知识点。有时候也可以多想出几种方法
这道题与校门外的树的思考方式差不多,可以不用完全平方数!也是将开的灯设为?将关的灯设为?
先不放代码自己思考吧