【链接】:https://www.nowcoder.com/link/winter242
比赛时间:2024-02-02 13:00-18:00
赛制:ACM
前提:这三道是本小白比赛期间打出的,顺带复个盘,剩下的就是补题了o(╥﹏╥)o
目录
A.DFS搜索
思路:字符串,for循环,查找,判断是否存在
子序列的定义:从原字符串中选择一些字符,将这些字符按照其在原串中的顺序拼接起来,得到的就是原字符串的一个子序列。例如:ABCDA的子序列可以为ACA、ABCDA、BA等等,但不能为ABE、CBA、AAD。
#include <bits/stdc++.h>
using namespace std;
bool DFS(string s){
int len=s.size();
int ans=0;
for(int i=0;i<len-2;i++){
if(s[i]=='D'){
for(int j=i+1;j<len-1;j++){
if(s[j]=='F'){
for(int k=j+1;k<len;k++){
if(s[k]=='S')ans++;
}
}
}
}
}
if(ans)return 1;
else return 0;
}
bool dfs(string s){
int len=s.size();
int ans=0;
for(int i=0;i<len-2;i++){
if(s[i]=='d'){
for(int j=i+1;j<len-1;j++){
if(s[j]=='f'){
for(int k=j+1;k<len;k++){
if(s[k]=='s')ans++;
}
}
}
}
}
if(ans)return 1;
else return 0;
}
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
for(int i=0;i<t;i++){
int n;cin>>n;
string s;cin>>s;
int a=0,b=0;
if(DFS(s))a=1;
if(dfs(s))b=1;
cout<<a<<" "<<b<<'\n';
}
return 0;
}
复盘:代码感觉太过于乱,且代码量太大,不够精简
看完题解后,才发现数据给的那么小,就是为了让我比赛期间打的那个i,j,k这种时间复杂度为O(n^3)好过。。。。。
重新写了个代码,AC,这个的话时间复杂度为O(n)
#include <bits/stdc++.h>
using namespace std;
string s1="DFS",s2="dfs";
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--){
int n;cin>>n;
string s;cin>>s;
int a=0,b=0;
int temp1=0,temp2=0;
for(int i=0;i<n;i++)
{
if(s[i]==s1[a])a++;
if(s[i]==s2[b])b++;
}
if(a==3)temp1=1;
if(b==3)temp2=1;
cout<<temp1<<" "<<temp2<<'\n';
}
return 0;
}
DFS搜索:深度优先搜索
牛客题解给的解法有两种:
1. 设置变量p表示DFS目前已经匹配到了第几个字母,遇到下一个字母就让p++,检查p是不是3
2.枚举三个位置i,j,k,判断s[i],s[j],s[k],是否分别对应DFS
L.要有光
思路:手推,画图
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--){
int c,d,h,w;cin>>c>>d>>h>>w;
double ans=0;
ans=3*w*c;
cout<<ans<<'\n';
}
return 0;
}
复盘:这个比赛期第一眼看到后,感觉这道题有点麻烦,就懒得去思考,打着打着有人跟我说了才去看,发现这道题其实是个很简单的数学问题,就是需要画一下,而且最优其实的是将光源放在地上
M.牛客老粉才知道的秘密
思路:手推,找规律,多尝试几组样例
所以在推导过程中,会发现只需要考虑两种情况就行
①n为6的倍数 ②n不为6的倍数
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
for(int i=0;i<t;i++)
{
int n;cin>>n;
if(n%6==0)cout<<n/6<<'\n';
else cout<<n/6*2<<'\n';
}
return 0;
}