2018 “百度之星”程序设计大赛 - 初赛(A)(-4)

版权声明:欢迎指出文章不足之处~~~ https://blog.csdn.net/zhui_xiuge/article/details/81592136

1. 度度熊拼三角

分析: 看最紧临的并且尽可能长的3根木棒是否构成三角形

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1005;

bool cmp(const int& a, const int& b) {
    return a > b;
}

int main() {
    int len[N];
    int n;
    while (cin >> n) {
        for (int i = 0; i < n; i++) cin >> len[i];
        sort(len, len + n, cmp);
        int ans = 0;
        for (int i = 1; i < n-1; i++) {
            if (len[i] + len[i + 1] > len[i - 1]) {
                for (int k = i - 1; k <= i + 1; k++) ans += len[k];
                break;
            }
        }
        cout << (ans ? ans : -1) << '\n';
    }
    return 0;
}

2 . 度度熊学队列

分析: 无脑deque模拟就ac啦,当然,如果像题解那样开双向链表,同时记录一下首尾指针的位置,那么每次“合并”的时候就可以直接O(1)暴力”对接”,显然较deque模拟省时,时间复杂度为O(Q)

#include <iostream>
#include <cstdio>
#include <deque> 
using namespace std;
const int N = 150005;

deque<int> deq[N];
int n, q, opt, u, v, w, val;

void read(int &x) { //
    char ch = getchar(); x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}

//deque:在结尾或起始插入或移除元素——常数 O(1)
//clear:与容器大小成线性
void operate() {
    read(opt);
    if (opt == 1) {
        read(u), read(w), read(val);
        if (w == 0) deq[u].push_front(val);
        else deq[u].push_back(val);
    }
    else if (opt == 2) {
        read(u), read(w);
        if (deq[u].empty()) printf("-1\n");
        else {
            if (w == 0) printf("%d\n",deq[u].front()), deq[u].pop_front();
            else printf("%d\n", deq[u].back()), deq[u].pop_back();
        }
    }
    else {
        read(u), read(v), read(w);
        if (w == 0) {
            for (int i = 0; i < deq[v].size(); i++) {
                deq[u].push_back(deq[v].at(i));
            }
        }
        else {
            for (int i = deq[v].size()-1; i >=0 ; i--) {
                deq[u].push_back(deq[v].at(i));
            }
        }
        if (!deq[v].empty()) deq[v].clear();
    }
}

int main() {
    while (scanf("%d%d", &n, &q) != EOF) {
        for (int i = 1; i <= n; i++) if (!deq[i].empty()) deq[i].clear(); 
        while (q--) {
            operate();
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhui_xiuge/article/details/81592136
今日推荐