递归检测。因为dis数组开的不够大,各种wa。写了个数据发生器,果断发现错误,改完就过了。
1 #include2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 #define MAXN 55 9 10 int n;11 double a[MAXN], dis[MAXN*2];12 char visit[MAXN]; // 0: false, 1: left, 2:right13 14 bool dfs(int x, double l) {15 if (x == n-1)16 return true;17 if (x == 0) {18 visit[x] = 2;19 return dfs(x+1, l);20 }21 if (visit[x-1] == 2) {22 if (a[x-1]+l <= a[x]) {23 visit[x] = 2;24 if ( dfs(x+1, l) )25 return true;26 } else if (a[x]+l <= a[x+1]) {27 visit[x] = 1;28 return dfs(x+1, l);29 }30 return false;31 } else {32 if (a[x-1]+2*l <= a[x] || a[x-1]+l==a[x]) {33 visit[x] = 2;34 if ( dfs(x+1, l) )35 return true;36 } else if (a[x]+l <= a[x+1]) {37 visit[x] = 1;38 return dfs(x+1, l);39 }40 return false;41 }42 }43 44 int main() {45 //FILE *fout = fopen("data", "w");46 int case_n, m;47 int i;48 49 scanf("%d", &case_n);50 while (case_n--) {51 scanf("%d", &n);52 for (i=0; i =0; --i) {62 if (dis[i] != dis[i+1]) {63 memset(visit, 0, sizeof(visit));64 if ( dfs(0, dis[i]) )65 break;66 }67 }68 printf("%.3lf\n", dis[i]);69 //fprintf(fout, "%.3lf\n", dis[i]);70 }71 72 return 0;73 }