zoukankan      html  css  js  c++  java
  • noip飞扬的小鸟

    题解:

    挺简单的题目

    f[i][j]表示x坐标为i,y坐标为j的最小值

    会发现那个东西是个完全背包

    从f[i][j-a[i]]转移一下就是O(1)转移的了

    另外上界为m这个要特判一下

    我把sum[a[i]]写成了sum[i]还过了样例拿了65分真的是神奇

    另外注意一下要先计算再判断不可行的

    因为他是在前一格瞬间跳到那么高

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define rint register int
    #define IL inline
    #define rep(i,h,t) for (rint i=h;i<=t;i++)
    #define dep(i,t,h) for (rint i=t;i>=h;i--)
    const int N=2e4;
    int f[2][2000],n,m,k,a[N],b[N],sum[N],t[N][2];
    struct re{
      int a,b,c;
    }c[N];
    const int INF=1e9;
    void minn(int &x,int y)
    {
      if (x>y) x=y;
    }
    int main()
    {
      ios::sync_with_stdio(false);
      cin>>n>>m>>k;
      rep(i,1,n) cin>>a[i]>>b[i];
      rep(i,1,k) cin>>c[i].a>>c[i].b>>c[i].c,c[i].b++,c[i].c--;
      rep(i,1,n) t[i][0]=1,t[i][1]=m;
      rep(i,1,k) t[c[i].a][0]=c[i].b,t[c[i].a][1]=c[i].c,sum[c[i].a]=1;
      rep(i,1,n) sum[i]+=sum[i-1];
      f[0][0]=INF;
      rep(i,1,n) 
      {
        rint now=i%2,lst=(i+1)%2;
        rep(j,1,m) f[now][j]=INF;
        rep(j,a[i]+1,m) minn(f[now][j],min(f[now][j-a[i]],f[lst][j-a[i]])+1);
        rep(j,m-a[i],m) minn(f[now][m],min(f[now][j],f[lst][j])+1);
        rep(j,1,m) 
          if (j+b[i]<=m) minn(f[now][j],f[lst][j+b[i]]);
        rep(j,0,t[i][0]-1) f[now][j]=INF;
        rep(j,t[i][1]+1,m) f[now][j]=INF;
        bool tt=1;
        rep(j,1,m) if (f[now][j]<INF) tt=0;
        if (tt)
        {
          cout<<0<<endl;
          cout<<sum[i]-1;
          exit(0);
        }
      }
      cout<<1<<endl;
      int ans=INF;
      rep(i,1,m) minn(ans,f[n%2][i]);
      cout<<ans<<endl;
      return 0;
    }
  • 相关阅读:
    (转)使用InfluxDB+cAdvisor+Grafana配置Docker监控
    Linux cut命令
    php 三种数组
    Linux httpd源码编译安装
    Linux yum如何下载rpm包到本地
    linux yum 工具
    windows phpstudy 本地添加自定义域名
    php.ini
    Linux rpm 查询
    linux rpm 安装和卸载
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/9510615.html
Copyright © 2011-2022 走看看