1 solutions
-
0
Guest MOD
-
0
#include<cstdio> #include<cstring> #define MAXN 15500 #define inf 0x3fffffff int a[MAXN],d[MAXN],u[MAXN],init,n,f[MAXN][70]; int minn(int x,int y) { return x<y?x:y; } bool dp(int lim) { for(int i=0;i<=63;i++) { f[0][i]=inf;//事实上,赋值为于init也是可行的; } f[0][0]=init; int tmp; for(int i=1;i<=n;i++) { if(a[i]>6) { for(int s=0;s<=63;s++) { f[i][s]=inf; if(f[i-1][s]<=lim) { f[i][s]=f[i-1][s]-d[i]; } } } else { tmp=1<<(a[i]-1); for(int s=0;s<=63;s++) { f[i][s]=inf; if((s>>(a[i]-1))&1) { if(f[i-1][s^tmp]<=lim) { f[i][s]=f[i-1][s^tmp]-d[i]; } } else { if(f[i-1][s]<=lim) { f[i][s]=f[i-1][s]+u[i]; } if(f[i-1][s^tmp]<=lim) { f[i][s]=minn(f[i][s],f[i-1][s^tmp]+u[i]); } } } } } for(int s=0;s<=63;s++) { if(f[n][s]<=lim) { return true; } } return false; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1;i<=n;i++) { scanf("%d",&d[i]); } for(int i=1;i<=n;i++) { scanf("%d",&u[i]); } scanf("%d",&init); int L=init,R=inf,M; while(L<=R) { M=(L+R)>>1; if(dp(M)) { R=M-1; } else { L=M+1; } } printf("%d",L); return 0; }
- 1
Information
- ID
- 155
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 9
- Tags
- (None)
- # Submissions
- 77
- Accepted
- 5
- Uploaded By