前言
周六的实验室好热…
中途有事, 只做了两个小时就把队友鸽那了, yl签了个D, 我签了个B, 然后就疯狂想F怎么数位DP, 结果走的时候问了下sy发现是打表, 我傻了… 然后发现A是个裸的博弈论, 打算好好学一下sg函数.
B翻译错了wa了一发, 最后两题溜了. 一鸣队好强, A了5题… 女人只会影响我拔剑的速度
之后训练步入正轨, 打一下每场cf和牛客杭电多校, 每场都记录一下题意和知识点, 方便之后学习参考吧
A. Alice and Bob
题意
(这个题目就把博弈论三个字写在脸上了, 奈何不会sg函数) 题意是两个人拿两堆石子, 每个人可以从一堆中拿k(任意)个, 从另一堆拿s*k个, 问谁赢
分析
博弈论, 待后续补题
B. Ball Dropping
题意
给出一个倒着放无盖等腰梯形, 问从中线位置落下一个球, 能否卡在梯形中, 输出球心最终高度
分析
签到题, 平面几何问题, 官方是用的相似, 我是用的点到直线距离公式, 令距离等于球的半径
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int r, a, b, h;
double xx1, yy1, xx2, yy2, xx3, yy3, xx4, yy4;
double k1, k2;
double A, B, C;
double ansy;
void init()
{
xx1 = 0, yy1 = h;
xx2 = (a - b) * 1.0 / 2, yy2 = 0;
xx3 = a * 1.0 / 2 + b * 1.0 / 2, yy3 = 0;
xx4 = a, yy4 = h;
k1 = (yy2 - yy1) / (xx2 - xx1);
A = k1;
B = -1;
C = yy1 - k1 * xx1;
}
void handle()
{
ansy = (a * 1.0 / 2 * A) + C - r * sqrt(A * A + 1);
if (ansy < 0) ansy = (a * 1.0 / 2 * A) + C + r * sqrt(A * A + 1);
}
int main(void)
{
cin >> r >> a >> b >> h;
init();
if (2 * r <= b) puts("Drop");
else
{
handle();
puts("Stuck");
printf("%.10lf", ansy);
}
return 0;
}
总结
wa了一发, 原因是翻译出现问题, 以为是是否能完全包含这个球, 之后可以对样例做一下详细的解析再写代码
C. Cut the Tree
题意
暂略
分析
线段树+点分治问题, 待后续补题, 应该鸽了
D. Determine the Photo Position
题意
给出一个n*n的01矩阵, 问这个矩阵中能包含多少个1*m的小矩形
分析
签到题, 由于能包含的是一个宽度为1的矩形, 因此枚举每两个1中间的空位, 令结果加上空位数-m+1即可
代码
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2010;
int n, m;
int a[N][N];
int ans;
string s;
int main(void)
{
cin >> n >> m;
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j <= n; j ++)
{
scanf("%1d", &a[i][j]);
}
}
cin >> s;
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j <= n; j ++)
{
int len = 0;
while (!a[i][j] && j <= n)
{
len ++;
j ++;
}
if (len >= m) ans += len - m + 1;
}
}
cout << ans << endl;
return 0;
}
总结
yl写的
E. Escape along Water Pipe
题意
给出一个水管迷宫, 每个方格有6种样式可以任意旋转, 从迷宫的左上角走到右下角, 问如何对迷宫内的方格进行旋转才可以走到, 输出整个走的路线
分析
由于旋转是任意的, 因此是一道bfs的搜索题, 只是每次进入的时候需要判断一下水管是从什么方向进入的, 能出到什么方向去, 存的时候连带着这个状态一起存进去
代码 (错误)
//后续补充
总结
还不知道错误原因, 可以参考第二场企鹅那道题目查查错
F. Find 3-friendly Integers
题意
给出一个区间范围, 问这个范围内有多少"3friendly"数字, 这个数字的定义是一个数中任意相邻位数%3=0
分析
签到题, 三位数以内打表, 三位数以上都满足要求
代码(队友)
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int T;
LL l,r;
LL Work(LL x)
{
if(x>=100) return x-100+76;
int tot=0;
for(int i=1;i<=x;i++)
if(i%10%3==0||(i/10%3==0&&i>=10)||(i%10+i/10)%3==0)
tot++;
return tot;
}
int main()
{
cin>>T;
while(T--)
{
cin>>l>>r;
cout<<Work(r)-Work(l-1)<<endl;
}
return 0;
}
总结
比赛时候没做出来的主要原因有两点
- 题意理解的有问题, 当时觉得0是不属于"3友好数字"的, 因此导致可能出现很多位都要单独讨论的情况. 但其实看到AC率, 就应该想到0的问题 (虽说当时想到了, 理解偏了, 以为是公式题)
- 做法想复杂了, 一直在考虑数位DP的做法, 还是时间复杂度掌握的不好
G. Game of Swapping Numbers
题意
暂略
分析
贪心+结论, 待后续补题
H. Hash Function
题意
暂略
分析
FFT+简单数论, 待后续补题
I. Increasing Subsequence
题意
暂略
分析
动态规划, 待后续补题
J. Journey among Railway Stations
题意
暂略
分析
线段树, 待后续补题
K. Knowledge Test about Match
题意
暂略
分析
贪心+KM算法, 后续估计也不会补题