codevs1163访问艺术馆

来源:互联网 发布:知远战略与防务论坛 编辑:程序博客网 时间:2024/04/30 11:53

此题为坑啊啊!

#include<iostream>  #include<cassert>  #include<cstdio>  #include<cstring>  #include<algorithm>  #include<cmath>  #include<string>  #include<iterator>  #include<cstdlib>  #include<vector>  #include<stack>  #include<map>  #include<set>  using namespace std;  #define debug(x) cout<<"debug "<<x<<endl;  #define LLD "%I64d"  #define rep(i,f,t) for(int i = (f),_end_=(t); i <= _end_; ++i)  #define rep2(i,f,t) for(int i = (f),_end_=(t); i < _end_; ++i)  #define dep(i,f,t) for(int i = (f),_end_=(t); i >= _end_; --i)  #define dep2(i,f,t) for(int i = (f),_end_=(t); i > _end_; --i)  #define clr(c, x) memset(c, x, sizeof(c) )  typedef long long int64;  const int INF = 0x5f5f5f5f;  const double eps = 1e-8;  int n,tm;  int a[110];  int d[110][660];    void solve(int id,int t,int v)  {      d[id][0] = t;      a[id] = v;      if(v > 0)      {          for(int i = 1; i <= v; ++i)          {              d[id][i] = d[id][i-1] + 5;          }          d[id][0] = 0;          return ;      }      int x1,x2,y1,y2,lc,rc;      scanf("%d%d",&x1,&y1);      solve(lc = ++n, x1*2, y1);      scanf("%d%d",&x2,&y2);      solve(rc = ++n, x2*2, y2);      int up = a[id] = a[lc] + a[rc];      for(int i = 1; i <= up; ++i)      {          rep(j,0,a[lc])          {              int k = i - j;              if(k < 0 || k > a[rc])continue;              d[id][i] = min(d[lc][j] + d[rc][k] + d[id][0]   ,  d[id][i]);          }      }      d[id][0] = 0;  }  int main()  {      scanf("%d",&tm);      if(tm < 5)      {          printf("0\n");          return 0;      }      n = 1;      int x,y;      scanf("%d%d",&x,&y);      clr(d,INF);      solve(1,x*2,y);      int i = upper_bound(d[1], d[1]+125, tm) - d[1] - 1;      assert(i >= 0);      printf("%d\n",i);      return 0;  }  

0 0
原创粉丝点击