分析
通过分析会发现答案不超过5000(待验证)
所以设f[i][j]表示第i个时刻能否在第j个石柱上
暴力DP即可

#include <iostream> #include <cstdio> #include <memory.h> using namespace std; const int N=1e3+10; int x; int n,a[N],b[N]; bool f[5010][N],ok; int main() { for (scanf("%d",&x);x;x--) { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); memset(f,0,sizeof f);f[0][0]=1;ok=0; for (int i=1;i<=5000;i++) { for (int j=0;j<=n+1;j++) if (j==0||j==n+1||i%(a[j]+b[j])>=1&&i%(a[j]+b[j])<=a[j]) { for (int k=-5;k<=5;k++) if (j+k>=0&&j+k<=n+1&&f[i-1][j+k]) { f[i][j]=1; if (j==n+1) { printf("%d ",i); ok=1; } break; } if (ok) break; } if (ok) break; } if (!ok) printf("No "); } }