【ACM专题训练】线性数据结构

报数

有n 个小朋友做游戏,他们的编号分别是 1,2,3...n。他们按照编号从小到大依次顺时针围成一个圆圈,从第一个小朋友开始从 1 报数,依次按照顺时针方向报数(加一),报 m 的人会离开队伍,然后下一个小朋友会继续从 1 开始报数,直到只剩一个小朋友为止。

输入格式

第一行输入两个整数,n,m。(1 \leq n,m \leq 10001≤n,m≤1000)

输出格式

输出最后一个小朋友的编号,占一行。

样例输入复制

10 5

样例输出复制

3
#include <iostream>
#include <queue>
using namespace std;
int main(){
    int n,m;
    cin >> n >> m;
    queue<int> q;
    for(int i = 0;i < n ;i++){
        q.push(i);
    }
    int now = 0;
    while(q.size() > 1){
        int x = q.front();
        q.pop();
        now++;
        if(now == m){
            now = 0;
        }
        else{
            q.push(x);
        }
    }
    cout << q.front()+1;

    
    
    
    return 0;
}

括号匹配

蒜头君在纸上写了一个串,只包含'('')'。一个'('能唯一匹配一个')',但是一个匹配的'('必须出现在')'之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。

输入格式

一行输入一个字符串只含有'('')',输入的字符串长度不大于 50000。

输出格式

如果输入括号不能匹配,输出一行"No",否则输出一行"Yes",接下里若干行每行输出 2 个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 1 开始)。你可以按照任意顺序输出。

本题答案不唯一,符合要求的答案均正确

样例输入1复制

(())

样例输出1复制

Yes
1 4
2 3

样例输入2复制

()()

样例输出2复制

Yes
1 2
3 4
#include <cstdio>
#include <stack>
#include <iostream>
using namespace std;

int main(){
    string a;
    cin >> a;
    int n = a.size();
    stack<int> s;
    bool flag = true;
    int x[50000],y[50000],len = 0;
    for(int i = 0;i < n;i++){
        if(a[i] == '('){
            s.push(i+1);
        }
        else{
            if(s.size() == 0){
                flag = false;
                break;
            }
        
        	else{
            	x[len] = s.top();
            	s.pop();
            	y[len] = i + 1;
            	len++;
        	}
        }
    }
    if(s.size()){
        flag = false;
    }
    if(flag){
        cout << "Yes" << endl;
        for(int i = 0;i < len;i++){
            cout << x[i] << " " << y[i] << endl;
        }
    }
    else{
        cout << "No" << endl;
    }
    return 0;
}

网页跳转

蒜头君每天都在用一款名为“蒜厂浏览器”的软件。在这个浏览器中,一共三种操作:打开页面、回退和前进。它们的功能如下:

  • 打开页面:在地址栏中输入网址,并跳转到网址对应的页面;
  • 回退:返回到上一次访问的页面;
  • 前进:返回到上次回退前的页面,如果上一次操作是打开页面,那么将无法前进。

现在,蒜头君打开浏览器,进行了一系列操作,你需要输出他每次操作后所在页面的网址。

输入格式

第一行输入一个整数 n(0 < n \le 100000)n(0<n≤100000),表示蒜头君的操作次数。

接下来一共 nn 行,每行首先输入一个字符串,如果是VISIT,后面接着输入一个不含有空格和换行的网址(网址长度小于 100100),表示蒜头君在浏览器地址栏中输入的网址;如果是BACK,表示蒜头君点击了回退按钮;如果是FORWARD,表示蒜头君点击了前进按钮。

输出格式

对于每次操作,如果蒜头君能操作成功,输出蒜头君操作之后的网址,否则输出Ignore假设蒜头君输入的所有网址都是合法的

样例输入复制

10
VISIT https://www.jisuanke.com/course/476
VISIT https://www.taobao.com/
BACK
BACK
FORWARD
FORWARD
BACK
VISIT https://www.jisuanke.com/course/429
FORWARD
BACK

样例输出复制

https://www.jisuanke.com/course/476
https://www.taobao.com/
https://www.jisuanke.com/course/476
Ignore
https://www.taobao.com/
Ignore
https://www.jisuanke.com/course/476
https://www.jisuanke.com/course/429
Ignore
https://www.jisuanke.com/course/476

 

#include <cstdio>
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;

int main(){
    int n;
    string op,wb;
    cin >> n;
    stack<string> s1,s2;
    while(n--){
        cin >> op ;
        if(op[0] == 'V'){
            cin >> wb;
            s1.push(wb);
            cout << s1.top() << endl;
			while(!s2.empty()){
                s2.pop();
            }
        }
        else if(op[0] == 'B' && s1.size() > 1) {
            s2.push(s1.top());
            s1.pop();
            cout << s1.top() << endl;

        }
        else if(op[0] == 'F' && s2.size()){
            s1.push(s2.top());
            s2.pop();
        	cout << s1.top() << endl;
            
        }
        else {
			cout << "Ignore" << endl;
        }
    }
    return 0;
}

 


版权声明:本文为qq_41514794原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。