noip飛揚的小鳥
阿新 • • 發佈:2018-08-21
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++) #definedep(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飛揚的小鳥