题解 P1610 【鸿山洞的灯】

引领天下

2017-07-21 17:48:12

Solution

啊哈水题! 其实呢,我觉得这题大可不必用 dp,一个简单贪心搞定! 思路: 读进 $n$ 和 $dist$。 然后读入 $p_i$,排序。 之后就是核心代码了。 首先,题目中说如果 $p_{i+1}-p_{i-1}\le dist$ 就可以把 $p_i$ 关掉,那么,第 $1$ 盏肯定不能关,最后一盏也不能关。 于是,就有了从 1 到 $n-2$ 的循环(我用的是 0 下标)。 每次向前,找到离 $i$ 最近的一盏开着的灯,看看能不能把 $p_i$ 关掉(因为是从左往右找,所以右边的灯都未处理,是开着的)。 如果可以把 $p_i$ 关掉,那就把它标记为 0,$ans\leftarrow ans+1$ 一趟循环走下来,答案就出来了。 此时,数组里除了必须留着的灯,其他都关掉了(标记为 0)。 最后输出就好了。 代码: ```cpp #include <bits/stdc++.h>//万能头 using namespace std; int p[100001],n,dist,i,ans; int main(void){ scanf ("%d%d",&n,&dist); for (;i<n;i++)scanf ("%d",&p[i]); sort(p,p+n);//排序 for (i=1;i<n-1;i++) if (p[i-1]!=0&&p[i+1]-p[i-1]<=dist)p[i]=0,ans++;//如果i-1是开着的,就可以不用开循环找了 else{//不然向前找 int j=i-1; while (p[j]==0)j--; if (p[i+1]-p[j]<=dist)p[i]=0,ans++; } printf ("%d",ans);//输出 } ```