正题
题目大意
nnn个木板第iii个浮起来aisa_i\ sai s后沉bisb_i sbis如此反复。
每sss最多可以跨555格,最短时间到达右边。
解题思路
设fi,jf_{i,j}fi,j表示在第isi\ si s的时候是否可以到达第jjj格木板
然后显而易见fi,j=fi,k(∣k−j∣≤5)f_{i,j}=f_{i,k}(|k-j|\leq 5)fi,j=fi,k(∣k−j∣≤5)
滚动一下然后暴力判断如果进行了很多次就无解
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1100;
int G,t,a[N],b[N],f[2][N],n;
int main()
{freopen("riv9.in","r",stdin);scanf("%d",&G);while(G--){scanf("%d",&n);memset(b,0,sizeof(b));for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);memset(f,0,sizeof(f));t=1;f[1][0]=1;n++;a[0]=1;a[n]=1;bool flag;while(!f[t&1][n]){flag=1;for(int i=0;i<=n;i++){if(!f[t&1][i]) continue;flag=0;for(int j=-5;j<=5;j++){int z=i+j;if(z<0||z>n) continue;if((t-1)%(a[z]+b[z])+1>a[z]) continue;f[~t&1][z]=1;}}if(t>10000000/n) flag=1;if(flag) break;memset(f[t&1],0,sizeof(f[t&1]));t++;}if(flag) printf("No\n");else printf("%d\n",t-1);}
}