L1-6 吉老师的回归 (15 分)
这个题应该算是字符串中简单的题,但是我但是只得了9分,实在是太不应该,原因是我find()函数用法不熟练导致的,其实string里面本来就带着专属的find()函数,直接string t;t.find(“字符串”);就可以了
此处附上find()函数的用法
string str1, str2;
char c;
str1.find(str2);//从串str1中查找时str2,返回str2中首个字符在str1中的地址
str1.find(str2,5);//从str1的第5个字符开始查找str2
str1.find(c);//在str1中查找字符o并返回第一个查找到的地址
str1.find("str2",2 , 2);//从str1中的第二个字符开始查找of big的前两个字符
find()函数返回值如果可以找到子串就返回子串第一个字符所在的位置,如果找不到子串就返回-1,表示未找到子串。
注意:
这个题有一个点之后做的时候也是有一分一直过不了,原因是在吉老师做的题目做完之后要返回他下一个要做的题目,但是不能只是简单地返回第i+1个题目,要判断第i+1个题目是否是简单题,如果是简单题的话就不输出,要是难题才可以输出
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
getchar();
vector<string> v;
for(int i=0;i<n;i++)
{
string t;
getline(cin,t);
v.push_back(t);
}
int falg=0;
for(int i=0;i<n;i++)
{
int d1=v[i].find("qiandao");
int d2=v[i].find("easy");
if(d1!=-1||d2!=-1);
else
{
if(m==0)
{
cout<<v[i]<<endl;
falg=1;
break;
}
m--;
}
}
if(falg==0)
{
cout<<"Wo AK le"<<endl;
}
}
L2-2 病毒溯源 (25 分)
这个题典型的DFS但是由于我实在是太菜了DFS掌握的极其不熟练所以我在正式打天梯赛的时候把DFS的思路替换成了很简单的找father的思路,但是由于不是真正的DFS,所以这个题没有得满分只是得了20,这里就不放我之前错误的代码了,这是我看着网上大佬正版的DFS搞的代码
找到第一条变异最长的链
这里强推vector数组非常的好用
#include<bits/stdc++.h>
using namespace std;
const int MAX=10005;
bool num[MAX][MAX];
bool ff[MAX];
vector<int> ans,tmp;
int maxn;
int n;
void dfs(int root,int len)
{
if(len > maxn)
{
maxn=len;
ans=tmp;
}
else if(len==maxn&&tmp<ans)
{
ans=tmp;
}
for(int i=0;i<n;i++)
{
if(num[root][i])
{
tmp.push_back(i);
dfs(i,len+1);
tmp.pop_back();
}
}
return;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int k;
cin>>k;
for(int j=0;j<k;j++)
{
int x;
cin>>x;
ff[x]=true;
num[i][x]=true;
}
}
int root=0;
while(ff[root])root++;
tmp.push_back(root);
dfs(root, 1);
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++)
{
if(i)
cout<<" ";
cout<<ans[i];
}
cout<<endl;
return 0;
}
L2-3 清点代码库 (25 分)
当时比赛的时候,就只是简单地用vector+结构体做的,但是不对,当时有两个点没过,有一个点超时,后来看的网上大佬都是用map做的,有时候很多题用map做就是不会超时
之前学C++的时候map就没太听懂
从网上看的大佬的map代码,一定要好好学map
#include<bits/stdc++.h>
using namespace std;
int N,M,i,t;
map<vector<int>,int>func;
multimap<int,vector<int> >func2;
vector<int>v;
int main(){
cin>>N>>M;
while(N--){
v.clear();
for(i=0;i<M;++i){
cin>>t;
v.push_back(t);
}
if(func.find(v)==func.end()){
func[v]=1;
}else{
++func[v];
}
}
for(auto i:func){
func2.insert(make_pair(-i.second,i.first));
}
cout<<func.size()<<endl;
for(auto i:func2){
cout<<-i.first;
for(auto j:i.second){
cout<<" "<<j;
}
cout<<endl;
}
return 0;
}