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
咕咕咕

浙公网安备 33010602011771号