题解:

按照时间枚举一下那些点有水

然后用物理方案来计算

代码:

#include<bits/stdc++.h>
const int N=25,M=110;
int n,m,x,y,z,i,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 (int 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 (int 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)
         {
             printf("%d",T);
            return 0;
         }
        for (int i=1;i<=n;i++)
         if (a[i].v&&a[i].y==a[i].h&&a[i].y==m)
          {
              puts("-1");
              return 0;
          }
        for (int i=1;i<=n;i++)
         if (a[i].v&&a[i].h==m)a[i].h--,T++;
       }
}

 

posted on 2018-02-22 14:44  宣毅鸣  阅读(...)  评论(... 编辑 收藏