目录
题单链接:(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)
代码(只给出解法一的代码):
#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;
}
}
未完待续......