算法题解-- stl

周末舞会

题目描述
​ 假设在周末舞会上,X 名男士和 Y 名女士进入舞厅时,各自排成一队,并分别按顺序编号。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲只能有一对跳舞者。跳完舞的人回到队尾。输出前 N 首舞曲的跳舞者编号。

输入
​ 一行三个数 X,Y,N。

输出
​ 输出共 N 行,一行两个数,分别代表跳这支舞曲的男士编号和女士编号,两数之间用空格隔开。

样例输入

3 5 6

样例输出

1 1
2 2
3 3
1 4
2 5
3 1
#include<iostream>
#include <queue>
using namespace std;

int m, w, n;

int main() {
    cin >> m >> w >> n;
    queue<int> man, wman;
    for (int i = 1; i <= m; i++) {
        man.push(i);
    }
    for (int i = 1; i <= w; i++) {
        wman.push(i);
    }
    for (int i = 1; i <= n; i++) {
        cout << man.front() << " " << wman.front() << endl;
        man.push(man.front());
        wman.push(wman.front());
        man.pop();
        wman.pop();
    }
    return 0;
}

合并果子
输入
​ 输入包括两行,第一行是一个整数 n(1≤n≤10000),表示果子的种类数。

​ 第二行包含 n 个整数,用空格分隔,第 i 个整数 ai(1≤ai≤20000) 是第 i 种果子的数目。

输出
​ 输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于 231。

样例输入
3
1 2 9
样例输出
15




#include<iostream>
#include <queue>
using namespace std;

int n, sum, ans;


int main() {
    cin >> n;
    priority_queue<int, vector<int>, greater<int>> que;
    for (int i = 1; i <= n; i++) {
        int t;
        cin >>  t;
        que.push(t);
    }
    while (que.size() >= 2) {
        int temp1 = que.top();
        que.pop();
        int temp2 = que.top();
        que.pop();
        sum = temp1 + temp2;
        ans += sum;
        que.push(sum);
    }
    cout << ans << endl;
    return 0;
}

报数

输入
​ 共一行两个数 N 和 M。

输出
​ 输出一个数表示最后一人的编号。

样例输入
7 3
样例输出
4

#include<iostream>
#include <queue>
using namespace std;

int n, m, now = 1;

int main() {
    cin >> n >> m;
    queue<int> cir;
    for (int i = 1; i <= n; i++) {
        cir.push(i);
    }
    while (cir.size() != 1) {
        if (now != m) {
            cir.push(cir.front());
            now++;
            cir.pop();
        }
        else {
            cir.front();
            cir.pop();
            now = 1;
        }
    }
    cout << cir.front() << endl;
    return 0;
}

字符串匹配

输入
​ 一行一个字符串,以字符@为结尾。

输出
​ 若匹配,输出 YES,若不匹配,则输出 NO。

样例输入
a(cc())bbb()@
样例输出
YES
样例输入2
a(cc()bbb()@
样例输出2
NO

借助栈实现: 字符串中字符与入栈的字符比较, 匹配则出栈, 不匹配则输出不匹配;


#include<iostream>
#include <stack>
#include <string>
using namespace std;

string s;

int main() {
    cin >> s;
    stack<char> str;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
            str.push(s[i]);
        }
        else if(s[i] == ')') {
            if (str.empty() || str.top() != '(') {
                cout << "NO" << endl;
                return 0;
            }
            str.pop();
        }
        else if (s[i] == '}') {
            if (str.empty() || str.top() != '{')  {
                cout << "NO" << endl;
                return 0;
            }         
            str.pop();
        }
        else if (s[i]  == ']') {
            if (str.empty() || str.top() != '[') {
                cout << "NO" << endl;   
                return 0;
            }
            str.pop();
        }
        
    }
    if (str.empty()) {
        cout << "YES" << endl;
    }
    else {
        cout << "NO" << endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值