1. 程式人生 > >noip飛揚的小鳥

noip飛揚的小鳥

struct nbsp round 真的是 noip exit 表示 include names

題解:

挺簡單的題目

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; }

noip飛揚的小鳥