不难的题啊
s是左括号右括号组成的串
p串代表右括号在串里的位置
w串代表从左往右的括号对里,每个括号对包含几个右括号
老师说这是模拟题,其他也说这是模拟题,可是百度半天只有 “模拟退火算法” 一篇非常简洁的 模拟退火算法讲解 ( ̄▽ ̄)
但是完全不符合啊!!!(╯°□°)╯︵ ┻━┻
虽然可以自己做出来,但是模拟法到底是个什么鬼!!!
我想的是先通过p串推s串,0代表左括号,1代表右括号
然后直接数s串里右括号的个数就好了,数一次就把这个括号对里本身的左括号用“2”覆盖掉
#include <iostream>
using namespace std;
int s_string[21];
int s_string_bool[10000]; //the real s_string and "0" reception left,"1" reception right
int main(int argc, const char * argv[]) {
int n;
cin>>n;
while (n--) {
int s; //the number of the s
cin>>s;
int i,j,count; //count is the number of the each right parenthesis
for (i=0; i<s; i++)
cin>>s_string[i];
for (i=0; i<s_string[0]; i++) {
s_string_bool[i]=0;
}
int l=i;
s_string_bool[i]=1;
l++;
for (i=1; i<s; i++) {
for (j=0; j<s_string[i]-s_string[i-1]; j++) {
s_string_bool[l]=0;
l++;
}
s_string_bool[l]=1;
l++;
}
for (i=0; i<l; i++) {
if (s_string_bool[i]==1) {
count=1;
for (j=i-1; j>=0; j--) {
if (s_string_bool[j]==0) {
s_string_bool[j]=2;
cout<<count<<" ";
break;
}
if (s_string_bool[j]==1) {
count++;
}
}
}
}
cout<<endl;
}
return 0;
}
就酱,今日第一题~