2021天梯赛

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值