zoukankan      html  css  js  c++  java
  • BZOJ1092 : [SCOI2003]蜘蛛难题

    按时间一步一步模拟。

    每一次,首先将所有没有水但是可以被灌到水的管子标记为有水,然后求出有水的管子里水面高度的最小值。

    如果$a$号管有水且最小值为$b$,那么说明此时蜘蛛碰到了水。

    如果有管子溢出且最小值就是它,那么说明此时无论如何水面都不会再上涨,即无解。

    然后往所有高度等于最小值的管子里灌上一高度的水即可。

    #include<cstdio>
    const int N=25,M=110;
    int n,m,i,j,x,y,z,A,B,T,g[N],v[M],w[M],nxt[M],ed;
    struct P{int x,y,h,v;}a[N];
    int getid(int x){for(int i=1;i<=n;i++)if(a[i].x==x)return i;}
    void add(int x,int y,int z){
      v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;
      v[++ed]=x;w[ed]=z;nxt[ed]=g[y];g[y]=ed;
    }
    int main(){
      scanf("%d",&n);
      for(i=1;i<=n;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].h),a[i].h+=a[i].y,a[i].v=i==1;
      scanf("%d",&m);
      while(m--)scanf("%d%d%d",&x,&y,&z),add(getid(x-1),getid(x+z),y);
      scanf("%d%d",&A,&B);
      while(1){
        for(x=1;x;)for(x=0,i=1;i<=n;i++)if(a[i].v)
          for(j=g[i];j;j=nxt[j])if(a[i].h<=w[j]&&!a[v[j]].v)a[v[j]].v=x=1;
        for(m=0,i=1;i<=n;i++)if(a[i].v&&a[i].h>m)m=a[i].h;
        if(a[A].v&&m==B)return printf("%d",T),0;
        for(i=1;i<=n;i++)if(a[i].v&&a[i].y==a[i].h&&a[i].y==m)return puts("-1"),0;
        for(i=1;i<=n;i++)if(a[i].v&&a[i].h==m)a[i].h--,T++;
      }
    }
    

      

  • 相关阅读:
    elk 搭建
    Web 开发规范 — WSGI
    Web 开发规范 — WSGI
    fastjson生成和解析json数据,序列化和反序列化数据
    第四章 字典
    Struts2 无后缀action请求
    字典和列表访问方式:
    第3章 使用字符串
    Struts2中的ModelDriven机制及其运用
    Struts2 的Action中取得请求参数值的几种方法
  • 原文地址:https://www.cnblogs.com/clrs97/p/5031030.html
Copyright © 2011-2022 走看看