2024牛客寒假算法基础集训营1--补题复盘

目录

A.DFS搜索--(签到题)

 M.牛客老粉才知道的秘密--(签到题)

L.要有光


题单链接:(0条未读通知) 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)

牛客官方给出的题目难度排序:

A.DFS搜索--(签到题)

原题:

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

最近,fried-chicken完全学明白了DFS搜索(如上图所示)!于是学弟向他请教DFS搜索,fried-chicken热心的进行了讲解:

所谓DFS搜索,就是给定一个字符串s,问能否找到sss的一个子序列,使得该子序列的值为 DFS 或 dfs。

请你分别判断字符串s中是否含有 DFS 子序列与 dfs 子序列。

子序列的定义:从原字符串中选择一些字符,将这些字符按照其在原串中的顺序拼接起来,得到的就是原字符串的一个子序列。例如:ABCDA的子序列可以为ACA、ABCDA、BA等等,但不能为ABE、CBA、AAD。

输入描述:

输入的第一行包括一个正整数T(1≤T≤100),表示测试用例的组数。

对每组测试用例,第一行是一个正整数n(1≤n≤50),表示输入字符串的长度。第二行是一个长度为n的字符串s,保证字符串中只含有英语小写字母与英语大写字母。

输出描述:

对于每组测试用例,输出空格分隔的两个数字,第一个数字表示是否含有 DFS 子序列,第二个数字表示是否含有 dfs 子序列。输出 1 表示含有,输出 0 表示不含有。

示例1

输入

5
6
dafasa
6
dDFfSs
6
sfdDSF
6
DFSDFS
3
dfs

输出

0 1
1 1
0 0
1 0
0 1

思路:

 虽然题目写了DFS,但是考查的根本不是DFS,^_^吓人的,其实就是一道签到题啦~

解法一(优):在循环里用 i 来记录已经找到了几个对应的字母,找到一个就i++,出循环后如果 i==3,说明含有子序列,否则不含有,时间复杂度o(n)

解法二:因为本题数据范围n很小,所以可以直接暴力枚举 i,j,k,判断 s[i] s[j] s[k] 是否对应“DFS”和“dfs”,时间复杂度o(n^{3})

代码(只给出解法一的代码):

#include<bits/stdc++.h>
using namespace std;
int solve(string a,string s,int n)
{
    int i=0,j=0;
    while(i<3&&j<n)
    {
        if(a[i]==s[j])
            i++;
        j++;
    }
    if(i==3)
        return 1;
    else
        return 0;
}

int main()
{
    int t;
    cin>>t;
    string D="DFS",d="dfs";
    while(t--)
    {
        int n;
        cin>>n;
        string s;
        cin>>s;
        cout<<solve(D,s,n)<<' ';
        cout<<solve(d,s,n)<<endl;
    }
}

 M.牛客老粉才知道的秘密--(签到题)

原题: 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

现在,在本次比赛的主页点击"排名",您就会看到本场比赛的榜单,可以看到,榜单中直接列出了本场比赛的所有题目。

现在,作为牛客老粉,炸鸡想用这道题给大家科普一下牛客以前榜单的愚蠢之处:

牛客以前的榜单并不是现在这样,而是至多同时只显示六道题目。同时榜单上还有"向左"按钮与"向右"按钮来切换显示的题目。以"向右"按钮为例,点击一次该按钮会显示接下来的六道题,特别的,如果接下来的六道题超出了总题数,则会将最后一题放到当前显示的最右侧。"向左"按钮同理。

现在,你需要回答,对于nnn道题的一场比赛,显示的六道题目中最左侧的题目一共有几种可能取值。

以下面共n=14n=14n=14道题的情况为例:

 



初始时,显示了 A 到 F;点击一次"向右",显示了 G 到 L;再点击一次"向右",此时由于剩余题数不足六题,显示的六道题是 I 到 N;此时不能继续点击"向右",点击一次"向左",显示的六道题是 C 到 H;再点击一次"向左",由于剩余题数不足六题,显示的六道题是 A 到 F。

上述过程中,显示的六道题中,最左侧的题目编号分别是 A、G、I、C、A,因此答案为 4。

输入描述:

输入的第一行包括一个正整数T(1≤T≤105),表示测试用例的组数。

每组测试用例输入一个正整数n(6≤n≤109),表示本场比赛的总题目数。

输出描述:

对每组测试用例,输出一个整数,表示显示的六道题目中最左侧的题目一共有几种可能取值。

示例1

输入

2
14
6

输出

4
1

思路:直接上代码,看完就知道了

 代码:

#include<iostream>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        long long int n;
        cin>>n;
        if(n%6==0)
        {
            cout<<n/6<<endl;
        }  
        else
        {
            cout<<n/6*2<<endl;
        }
    }
}

L.要有光

 原题:

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld

题目描述

神说要有光,于是就有了本题。

 



如图所示,一个漆黑的世界可以用如图的三维坐标系来表示,XoY平面表示该世界的地面。

坐标系由以下几个组成部分:

1、一面无限宽无限高的白墙S,可以用如下公式表示:
{

x=−c

z≥0​

}

2、一面宽为2w高h的绿墙W(厚度忽略不计),可以用如下公式表示:
{

​x=0

−w≤y≤w

0≤z≤h​

}

3、这个世界唯一的点光源L(体积忽略不计),点光源必须在图中的黑色线段上,黑色线段可以用如下公式表示:

{

x=c

y=0

0≤z≤d​

}

神的目的是照亮这片大地,但同时也要防止人类给点阳光就灿烂。因此,神可以决定放置点光源L的位置(神必须放置点光源),使得未被照亮的土地面积尽可能大,请你输出未被照亮的土地面积的最大值

说明:对于地面上的一点,若其与点光源L的连线接触到了绿墙W,则该点未被照亮。

注意:神只想最大化未被照亮的土地面积最大值,墙面S上未被照亮的面积不算做土地面积。且我们不计算墙S背后(x轴负方向)的未被照亮的土地面积。

输入描述:

输入包含T(1≤T≤104)组测试用例。

每组测试用例包含四个整数c,d,h,w(1≤c,d,h,w≤104)c,d,h,w含义如题面所述。

输出描述:

输出一个浮点数,表示你的答案。当你的答案的绝对误差或相对误差小于10−410^{-4}10−4时,答案被视为正确。

示例1

输入

1
2 4 2 1

输出

6

思路: 

省流:答案就是3cw

这道题也是很简单的数学题,只用到了相似三角形,但是一定要审清题目!!!不要像我一样潜意识以为是要求白墙s上的最大阴影面积/流泪,其实求的是土地上的阴影面积,即xoy平面上的最大阴影面积。

可以推出当点光源在x轴上时有最大阴影面积(下方ps给出了解释),从下图俯视图可以看出阴影面积为梯形:绿色的边为绿墙w,即梯形上底为绿墙的宽度2w;红色的边为白墙s,根据相似三角形可知梯形下底为4w;梯形的高为c,所以根据梯形面积计算公式可得最大阴影面积为3cw

ps:如果点光源不在x轴上而是沿着黑色线段平行于z轴往上走时就肯会出现下面图片的情况:

此时阴影面积就不能到达白墙S了,就不是最大的阴影面积 

代码:

#include<iostream>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int c,d,h,w;
        cin>>c>>d>>h>>w;
        cout<<3*c*w<<endl;
    }
}

未完待续......

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值