1. 好久没碰到这种难度的题了:看题没思路,经过思考,推算,一次AC。以前的题要不太难,只能看解题报告,要不太简单,不用思考,这种难度的题正好适合我;
2. 具体思路是通过P序列还原成括号序列,然后通过括号序列得到W序列的值。注意map[ p[ i ] + i] = ‘)’。通过flag数组标记“)”之前的没有匹配的左括号;
3. 这道题属于模拟题(以后知道题的类型就分个类);
#include <iostream> #include <cstring> using namespace std; int main() { int i, j, k, tmp, t, n; int P, W[22], map[50], flag[50];//0=( 1=) cin >> t; while (t--) { cin >> n; memset(map, 0, sizeof(map)); memset(flag, 0, sizeof(flag)); for(i = 1; i <= n; i++) { cin >> P; map[P + i] = 1; } for(i = 1; i <= 2 * n; i++) if (map[i] == 0) flag[i] = 1; else flag[i] = 2; for(i = 1, j = 1; i <= 2 * n; i++) if (map[i] == 1) { tmp = 1; for (k = i; k > 0; k--) { if (flag[k] == 0) { tmp++; continue; } else if (flag[k] == 1) { W[j] = tmp; flag[k] = 0; j++; break; } } } for (i = 1; i <= n; i++) cout << W[i] << ' '; cout << endl; } return 0; }