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 }
时间: 2024-10-16 15:51:56

zoj5341 捕老鼠的相关文章

8.14-T2捕老鼠(cat)

题目大意 有 N 个仓库,排成了一排,编号为 1-N.假设在第 i 个仓库点燃艾条,烟雾就会充满该仓库,并向左右扩散Ai的距离,接着所有|i-j|<=Ai的仓库 j 的老鼠被消灭.最少需要多少支艾条. 题解 贪心的策略 不断找右端点最靠右(),且可以和之前选过的线段相连的线段,ans++. 时间复杂度O(nlogn到n^2之间??!) 但也能过... #include<bits/stdc++.h> using namespace std; inline int read() { int

JavaScript学习总结(四)——this、原型链、javascript面向对象

一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化,当然也可以使用call.apply修改this指向的对象.它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用 1.0.猜猜答案 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8&quo

7-37 抓老鼠啊~亏了还是赚了? (20 分)

7-37 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X).捕鼠夹可重复利用,不计成本,奶酪每块3元.聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥: 若什么也没有(X),老鼠们就不高兴了(Unhappy),会有长达一天(也就是第二天)的不高兴期.在不高兴期间,不派出老鼠.不高兴期结束之后,派出老鼠. 若有捕

7-1 抓老鼠啊~亏了还是赚了? (20 分)

7-1 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X).捕鼠夹可重复利用,不计成本,奶酪每块3元. 聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥: ?若什么也没有(X),老鼠们就不高兴了(Unhappy),会有长达一天(也就是第二天)的不高兴期.在不高兴期间,不派出老鼠.不高兴期结束之后,派出老鼠. ?若

抓老鼠啊~亏了还是赚了?

某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X).捕鼠夹可重复利用,不计成本,奶酪每块3元.聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥: 若什么也没有(X),老鼠们就不高兴了(Unhappy),会有长达一天(也就是第二天)的不高兴期.在不高兴期间,不派出老鼠.不高兴期结束之后,派出老鼠. 若有捕鼠夹(T),这只老鼠被引诱吃掉奶酪并被打死(Dea

抓老鼠啊~亏了还是赚了?编程总结

7-1 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X).捕鼠夹可重复利用,不计成本,奶酪每块3元. 聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥: 若什么也没有(X),老鼠们就不高兴了(Unhappy),会有长达一天(也就是第二天)的不高兴期.在不高兴期间,不派出老鼠.不高兴期结束之后,派出老鼠. 若有捕

抓老鼠

某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X).捕鼠夹可重复利用,不计成本,奶酪每块3元.聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥: 若什么也没有(X),老鼠们就不高兴了(Unhappy),会有长达一天(也就是第二天)的不高兴期.在不高兴期间,不派出老鼠.不高兴期结束之后,派出老鼠. 若有捕鼠夹(T),这只老鼠被引诱吃掉奶酪并被打死(Dea

抓老鼠 亏了还是赚了

题目7-1 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X).捕鼠夹可重复利用,不计成本,奶酪每块3元. 聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥: 若什么也没有(X),老鼠们就不高兴了(Unhappy),会有长达一天(也就是第二天)的不高兴期.在不高兴期间,不派出老鼠.不高兴期结束之后,派出老鼠. 若

7-1 抓老鼠啊~亏了还是赚了?

某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X).捕鼠夹可重复利用,不计成本,奶酪每块3元. 聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥: 若什么也没有(X),老鼠们就不高兴了(Unhappy),会有长达一天(也就是第二天)的不高兴期.在不高兴期间,不派出老鼠.不高兴期结束之后,派出老鼠. 若有捕鼠夹(T),这只老鼠被引诱吃掉奶酪并被打死(De