1、POJ 1068 Parencodings(括号处理)
http://poj.org/problem?id=1068
Description
Let S = s1 s2…s2n be a well-formed string of parentheses. S can be
encoded in two different ways: q By an integer sequence P = p1
p2…pn where pi is the number of left parentheses before the ith
right parenthesis in S (P-sequence). q By an integer sequence W = w1
w2…wn where for each right parenthesis, say a in S, we associate an
integer which is the number of right parentheses counting from the
matched left parenthesis of a up to a. (W-sequence).Following is an example of the above encodings:
S (((()()())))
P-sequence 4 5 6666
W-sequence 1 1 1456
Write a program to convert P-sequence of a well-formed string to the
W-sequence of the same string.
Input
The first line of the input contains a single integer t (1 <= t <=
10), the number of test cases, followed by the input data for each
test case. The first line of each test case is an integer n (1 <= n <=
20), and the second line is the P-sequence of a well-formed string. It
contains n positive integers, separated with blanks, representing the
P-sequence.
Output
The output file consists of exactly t lines corresponding to test
cases. For each test case, the output line should contain n integers
describing the W-sequence of the string corresponding to its given
P-sequence.
Sample Input
2
6
4 5 6 6 6 6
9
4 6 6 6 6 8 9 9 9
Sample Output
1 1 1 4 5 6
1 1 2 4 5 1 1 3 9
思路:构造括号序列,遍历+回溯
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define mp make_pair
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
typedef vector<int> VI;
typedef pair<int, int> PII;
const ll MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 50 + 7;//记得更换合适的MAXN
// ios::sync_with_stdio(false);
int main()
{
ios::sync_with_stdio(false);
int t,n;
int p[MAXN],w[MAXN];
int a[MAXN];
cin>>t;
while(t--)
{
int k=1;
cin>>n;
rep(i,1,n) cin>>p[i]; p[0]=0;
rep(i,1,n){//构造序列,1,0分别代表左、右
rep(j,1,(p[i]-p[i-1])){
a[k++]=1;
}
a[k++]=0;
}
int vis[100];//用来标记左括号是否已经被匹配
memset(vis,0,sizeof(vis));//0无匹配 (1被匹配)
rep(i,1,2*n){
int count=0;
if(a[i]==0){
per(j,i,1){//回溯
if(a[j]==0) count++;
if(a[j]==1&&vis[j]==0){
vis[j]=1;break;
}
}
cout<" ";
}
}
cout<return 0;
}
2、XTUOJ_1227(机器人坐标)
题目描述
假设在一个XOY坐标的平面上,机器人一开始位于原点,面向Y轴正方向。 机器人可以执行向左转,向右转,向后转,前进四个指令。 指令为
LEFT:向左转 RIGHT:向右转 BACK:向后转 FORWORD n:向前走n(1≤n≤100)个单位
现在给你一个指令序列,求机器人最终的位置。
输入
样例的第一行是一个整数T(T≤20),表示样例的个数。 每个样例的第一行是一个整数N(1≤N≤1,000),表示指令的条数。
以后的N行,每行一条指令。
输出
每个样例输出两个整数,为坐标(x,y),之间用空格隔开。
样例输入
2
4
LEFT
FORWORD 1
RIGHT
FORWORD 1
2
BACK
FORWORD 1
样例输出
-1 1
0 -1
思路:模拟水题,用数组dirc存每个方向上的step,直接上代码。
#include
using namespace std;
int main()
{
int t,n;
int step;
char s[10];
cin>>t;
while(t--)
{
int dirc[4]={0,0,0,0};//0,1,2,3代表x,y,-x,-y
cin>>n;
int f=1;//初始方向为y,即1
while(n--)
{
cin>>s;
if(s[0]=='L') f=(f+1)%4;
if(s[0]=='R') f=(f-1)%4;
if(s[0]=='B') f=(f+2)%4;
if(s[0]=='F'){
cin>>step;
dirc[f]+=step;
}
}
cout<0]-dirc[2]<<" "<1]-dirc[3]<
3、牛客小白月赛5_J时间
链接:https://www.nowcoder.com/acm/contest/135/J
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
Apojacsleam是一个喜欢特殊时刻的人。
他定义了一个时刻,若电子表显示ab:ba(24小时制),则该时刻为“回文时刻”(可以有前导零)。例如00:00就是回文时刻。
给定一个时刻,求此时刻的上一个和下一个回文时刻。
J题附加:00:00就是24:00,没有24:00这一时刻
J题附加:输入可能有前导0,输出不含前导0,例如10:1的意思是10:01,而10:10的输出为10:10
输入描述:
两个正整数,用“:”隔开,表示小时和分钟,保证输入时间合法。
输出描述:
两行,两个时刻(不含前导0),用“:”隔开,表示上一个时刻和下一个时刻
输入
09:33
输出
5:50
10:1
输入
23:32
输出
22:22
0:0
思路:官方题解说是先记录所有回文时刻,打表模拟。但是,我在选手的提交中发现了一份简洁易懂的完美代码,很强
#include
#include
#include
#include
using namespace std;
int main()
{
int a,b;
while(~scanf("%d:%d",&a,&b))
{
int A=a,B=b;
while(1)//找上一个
{
b--;
if(b<0)
a--;
b=(b+60)%60;
a=(a+24)%24;
if(a/10==b%10&&a%10==b/10)//这个方法可以完美处理有或无前导0
{
printf("%d:%d\n",a,b);
break;
}
}
a=A;b=B;
while(1)//找下一个
{
b++;
if(b==60)
a++;
b=(b+60)%60;
a=(a+24)%24;
if(a/10==b%10&&a%10==b/10)
{
printf("%d:%d\n",a,b);
break;
}
}
}
return 0;
}