模拟专题

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;
}

你可能感兴趣的:(ACM_模拟,构造)