zoj5341 捕老鼠

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zoj5341 捕老鼠相关的知识,希望对你有一定的参考价值。

Description

为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠。于是,猫被农夫约派去捕老鼠。 猫虽然擅长捕老鼠,但是老鼠们太健美了,身手敏捷,于是猫想到了一个绝妙的办法:它决定点燃纯艾条,用烟熏老鼠。 农夫约的农庄里有N 个仓库,排成了一排,编号为1~N。

假设猫在第i 个仓库点燃艾条,烟雾就会充满该仓库,并向左右扩散Ai的距离,接着所有|i-j|<=Ai 的仓库j 的老鼠被消灭。 猫是一只爱护空气环境的好猫,它希望知道最少需要多少支艾条,才可以消灭所有老鼠。

Input
第一行:一个正整数,代表N。
第二行:N 个非负整数,第i 个数代表Ai。

Output
第一行:一个整数,代表答案。

Sample Input
10
2 0 1 1 0 3 1 0 2 0

Sample Output
3

Hint
Data Constraint

20%的数据:N <= 20
60%的数据:N <= 10^3
100%的数据:N <= 5*10^5,Ai <= N

  1 #include<queue>
  2 #include<cstdio>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include <cstring>
  6 #include <string.h>
  7 #include <cmath>
  8 #include <math.h>
  9 #define ll long long
 10 #define N 500005
 11 #define db double
 12 #define P putchar
 13 #define G getchar
 14 #define mo 1000000007
 15 using namespace std;
 16 char ch;
 17 void read(int &n)
 18 {
 19     n=0;
 20     ch=G();
 21     while((ch<0 || ch>9) && ch!=-)ch=G();
 22     ll w=1;
 23     if(ch==-)w=-1,ch=G();
 24     while(0<=ch && ch<=9)n=n*10+ch-0,ch=G();
 25     n*=w;
 26 }
 27 
 28 int max(int a,int b){return a>b?a:b;}
 29 int min(int a,int b){return a<b?a:b;}
 30 
 31 void write(int x)
 32 {
 33      if(x>9) write(x/10);
 34      P(x%10+0);
 35 }
 36 
 37 struct node
 38 {
 39     int x,l,r;
 40 }t[4*N];
 41 
 42 int n,f[N],a[N],opl,opr,x,opx,ops;
 43 
 44 void make(int x,int l,int r)
 45 {
 46     t[x].l=l;t[x].r=r;
 47     t[x].x=2147483647;
 48     if(l==r)return;
 49     int m=(l+r)/2;
 50     make(x+x,l,m);
 51     make(x+x+1,m+1,r);
 52 }
 53 
 54 void work(int x)
 55 {
 56     if(t[x].l>=opl && t[x].r<=opr)
 57     {
 58         if(opx==1)t[x].x=min(t[x].x,ops);
 59         if(opx==2)ops=min(ops,t[x].x);
 60         return;
 61     }
 62     if(t[x].l==t[x].r)return;
 63     int m=(t[x].l+t[x].r)/2;
 64     if(opl<=m)work(x+x);
 65     if(m<opr)work(x+x+1);
 66 
 67     t[x].x=min(t[x+x].x,t[x+x+1].x);
 68 }
 69 
 70 int main()
 71 {
 72     freopen("cat.in","r",stdin);
 73     freopen("cat.out","w",stdout);
 74     read(n);
 75     for(int i=1;i<=n;i++)
 76     {
 77         read(x);
 78         if(i+x<=n)a[i+x]=max(a[i+x],2*x+1);else a[n]=max(a[n],n-(i-x)+1);
 79     }
 80 
 81     memset(f,127,sizeof(f));
 82 
 83     make(1,1,n);
 84     for(int i=1;i<=n;i++)
 85     {
 86         opl=i-a[i];opr=i-1;
 87         if(opl<=0)f[i]=1;
 88         else
 89         {
 90             ops=f[i]-1;
 91             opx=2; 
 92             if(opl<=opr)work(1);
 93             f[i]=ops+1;
 94         }
 95         ops=f[i];opx=1;
 96         opl=opr=i;
 97         work(1);
 98     }
 99 
100     write(f[n]);
101 }

 

以上是关于zoj5341 捕老鼠的主要内容,如果未能解决你的问题,请参考以下文章

8.14-T2捕老鼠(cat)

web前端开发JQuery常用实例代码片段(50个)

p5341 [TJOI2019]甲苯先生和大中锋的字符串

事件捕获与事件冒泡

MATLAB实战系列(三十九)-matlab多目标优化之海洋捕食者算法

单目标优化求解基于matlab多子群改进的海洋捕食者算法(MSMPA)求解单目标优化问题含Matlab源码 1783期