2021牛客暑期多校夏令营第一场

前言

周六的实验室好热…
中途有事, 只做了两个小时就把队友鸽那了, 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;
}

总结

比赛时候没做出来的主要原因有两点

  1. 题意理解的有问题, 当时觉得0是不属于"3友好数字"的, 因此导致可能出现很多位都要单独讨论的情况. 但其实看到AC率, 就应该想到0的问题 (虽说当时想到了, 理解偏了, 以为是公式题)
  2. 做法想复杂了, 一直在考虑数位DP的做法, 还是时间复杂度掌握的不好

G. Game of Swapping Numbers

题意

暂略

分析

贪心+结论, 待后续补题


H. Hash Function

题意

暂略

分析

FFT+简单数论, 待后续补题


I. Increasing Subsequence

题意

暂略

分析

动态规划, 待后续补题


J. Journey among Railway Stations

题意

暂略

分析

线段树, 待后续补题


K. Knowledge Test about Match

题意

暂略

分析

贪心+KM算法, 后续估计也不会补题


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值