AtCoder-ZONe Energy Programming Contest营业日志

A.UFO Invasion

水题,扫一遍即可

B.Sign of Friendship

以塔底为坐标原点,地面为\(x\)轴,塔为\(y\)轴,建立平面直角坐标系。每次以UFO所在坐标和每个障碍物顶点坐标联立得到一次函数,求出其与\(y\)轴交点的纵坐标即为所需高度。在所有答案里面取\(max\)即可。

或者形式化的说:

\[ans=\max\limits_{i=1}^{n}h_i-\dfrac{h_i-H}{d_i-D}\times D \]

最后还有一点要注意,求出交点如果在\(y\)轴负半轴要舍去(赛时因为这个WA了一次/kk)

\(Code:\)

/*
 * @Author: Luisvacson
 * @LastEditors: Luisvacson
 * @Descriptions: None
 * @Date: 2021-05-01 20:05:46
 * @LastEditTime: 2021-05-01 20:18:58
 * @FilePath: \C++\Practice\B.cpp
 */
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1005

int n, d1, h1;
int d[MAXN], h[MAXN];
signed main() {
    scanf("%d%d%d", &n, &d1, &h1);
    register int i;

    double ans = -1;
    for (i = 1; i <= n; ++i) {
        scanf("%d%d", &d[i], &h[i]);
        int d2 = d[i], h2 = h[i];
        double k = (double)((h2 - h1) * 1.0 / (d2 - d1));
        double b = h1 - k * d1;
        b = max(b, 0.0);
        ans = max(ans, b);
    }

    printf("%.10lf\n", ans);
    return 0;
}

C.MAD TEAM

赛时先切的D,切完之后才开的C/jk

想了一会没什么很好的思路,于是决定乱搞,然后就发现这题和[TJOI2010]分金币有异曲同工之妙。

我们可以令1-3号为选择的人,然后模拟退火,每次交换1-3号中一人和其余的人,优化答案。

理论上模拟退火是正确的,但众所周知,这玩意本来就是玄学算法,所以比赛最后调参调了114514秒也没调出来(啊啊啊啊


如果加上C题的分数那我的rating就直接起飞了/dk
\(Code:\)(并不是AC代码,仅供参考,有兴趣的读者可以尝试自己调参)

/*
 * @Author: Luisvacson
 * @LastEditors: Luisvacson
 * @Descriptions: None
 * @Date: 2021-05-01 21:00:09
 * @LastEditTime: 2021-05-01 21:38:53
 * @FilePath: \C++\Practice\C.cpp
 */
#include <bits/stdc++.h>
using namespace std;
const double T = 0.996;
#define MAXN 3005
#define int long long

int n, ans;
struct node {
    int a, b, c, e, d;
} a[MAXN];
int Solve() {
    int A, B, C, D, E;
    A = max(a[1].a, max(a[2].a, a[3].a));
    B = max(a[1].b, max(a[2].b, a[3].b));
    C = max(a[1].c, max(a[2].c, a[3].c));
    D = max(a[1].d, max(a[2].d, a[3].d));
    E = max(a[1].e, max(a[2].e, a[3].e));
    return min(A, min(B, min(C, min(D, E))));
}

void SA() {
    double tp = 10000;
    while (tp > 1e-15) {
        int ix = rand() % 3 + 1, iy = rand() % n + 1;
        if (ix == iy) continue;
        swap(a[ix], a[iy]);
        int tans = Solve();
        int dif = tans - ans;
        if (tans > ans) {
            ans = tans;
        } else if (!(exp(-dif / tp) * RAND_MAX > rand())) {
            swap(a[ix], a[iy]);
        }

        tp *= T;
    }
}

signed main() {
    scanf("%lld", &n);
    register int i;
    for (i = 1; i <= n; ++i) {
        scanf("%lld%lld%lld%lld%lld", &a[i].a, &a[i].b, &a[i].c, &a[i].d,
              &a[i].e);
    }
    for (i = 1; i <= 2755; ++i) SA();
    printf("%lld\n", ans);
    return 0;
}

D.Message from Aliens

这道题应该算是比较套路的题目

首先第一点:Reverse不可能每次都进行。我们可以维护一个flag表示翻转或不翻转,如果flag=1则在前面插入新字符,否则在后面插入新字符。

所以很自然地,我们想到用deque维护每个字符。同时可以在插入的同时进行第二步解密:若当前要插入的字符和队首/队尾的字符相同则pop而不是push。(这个套路在之前的AtCoder Beginner Contest中也出现过)

\(Code:\)

/*
 * @Author: Luisvacson
 * @LastEditors: Luisvacson
 * @Descriptions: None
 * @Date: 2021-05-01 20:24:34
 * @LastEditTime: 2021-05-01 20:52:36
 * @FilePath: \C++\Practice\D.cpp
 */
#include <bits/stdc++.h>
using namespace std;

string s;
deque<char> Q;
signed main() {
    ios_base::sync_with_stdio(0);
    cin >> s;
    register int i;
    int n = s.size();
    int flag = 0;
    for (i = 0; i < n; ++i) {
        if (s[i] == 'R')
            flag ^= 1;
        else {
            if (flag) {
                if (!Q.empty()) {
                    char ch = Q.front();
                    if (ch == s[i])
                        Q.pop_front();
                    else
                        Q.push_front(s[i]);
                } else
                    Q.push_front(s[i]);
            } else {
                if (!Q.empty()) {
                    char ch = Q.back();
                    if (ch == s[i])
                        Q.pop_back();
                    else
                        Q.push_back(s[i]);
                } else
                    Q.push_back(s[i]);
            }
        }
    }

    if (flag) {
        while (!Q.empty()) {
            char ch = Q.back();
            putchar(ch);
            Q.pop_back();
        }
    } else {
        while (!Q.empty()) {
            char ch = Q.front();
            putchar(ch);
            Q.pop_front();
        }
    }

    return 0;
}

E.Sneaking

咕咕咕

F.Encounter and Farewell

咕咕咕

posted @ 2021-08-16 20:50  Luisvacson  阅读(63)  评论(0)    收藏  举报