2024天梯赛--理解错题意+脑子宕机

知识点模块

1.遍历九宫格中的每个3x3的方块可以按这么遍历

点击查看代码
//i j是行数和列数 就是每个3x3矩阵的起点 
      for(int i=1;i<=7;i+=3)
      {
      	for(int j=1;j<=7;j+=3){
      		
      		for(int x=i;x<i+3;x++)
      		{
      			for(int y=j;y<j+3;y++)
      			{
      				//里面放你所要进行的操作 
      				
      				
				  }
			  }
      		
      		
		  }
	  }

2.如果要实现相同字母缩写的语句的存放,比如dsb后面要存 da sha ba 和 da she bi可以使用map<string,multiset >mp来存放,一方面一个标记可以跟多个语句,一方面multiset可以自动对语句进行字典序的排序
map<string,multiset<string> >mp;
//使用multiset可以让放的字符串按字母序排
//map里面这样放可以实现首字母相同的句子的存放
3.我们要找到两个数组中有多少个相同的数字(统计匹配一次),只需要两层循环,匹配就break出来

点击查看代码
for(int i=0;i<ve[a].size();i++)
        {
        	for(int j=0;j<ve[b].size();j++)
        	{
        		if(ve[a][i]==ve[b][j]){
        			//这里记得要break出来,才能保证一个数只和它相等的匹配一次 
        			ans++;
        			break;
				}
			}
		}

题解模块

7-6 别再来这么多猫娘了!
这题还有两个点没过,先补上再说,思路就是遇到一个脏词后把词左端点标为<,右端点标为>,但是可能有一个词只有一个字母我把它标记为#,然后输出的时候开个flag=1,当遍历到<时把flag标为0,遇到>后再把flag标为1,flag为1原封输出

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
    int n;
    cin>>n;
    vector<string>ve(n+1);
    for(int i=1;i<=n;i++) cin>>ve[i];
    int k;
    cin>>k;
    cin.ignore();
    string s;
    getline(cin,s);
    //输入部分到此
    //从ve中的第一个词开始找计数看是否脏词超过k

    int sum=0;
    for(int i=1;i<=n;i++)
    {
        int cnt=0,pos=0;
        while((pos=s.find(ve[i],pos))!=-1)
        {
        	if(ve[i].size()==1) s[pos]='#';
            else{
			s[pos]='<';
            s[pos+ve[i].size()-1]='>';
			pos+=ve[i].size();
        	}
            cnt++;
        }
        //cout<<cnt<<endl;
        sum+=cnt;
    }
	
	//cout<<sum<<endl; 
    if(sum>=k){
        cout<<sum<<endl;
        cout<<"He Xie Ni Quan Jia!";
        return ;
    }

    bool flag=1;//用来处理尖括号内的
    //当flag为0时遍历到的就不操作就行了
    for(int i=0;i<s.size();i++)
    {
    	if(s[i]=='#') cout<<"<censored>";
		if(flag&&s[i]!='#') cout<<s[i];
    	if(s[i]=='<'){
    		flag=0;
    		cout<<"censored>";
		}
		if(s[i]=='>') flag=1;
	}
    cout<<endl;

    

    
}

signed main(){
	int t=1;
	//cin>>t;
	while(t--) solve();
	return 0;
	
}

这一题我就看错题目了,以为是要有匹配的个位数才行,真是一坨
7-7 整数的持续性

可以开一个二维的队列来存放对应次数下的数,因为我们从小到大枚举,这样输出的时候可以保证从小到大输出,然后就是验证一下每个数的次数,记录一下最大次数,然后把最大次数的队列输出就可以了

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
    int a,b,maxx=0;
    queue<int>q[1000];//存对应次数的数 
    cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
        int x=i,cnt=0;
        while(x>9)
        {
        	//temp用来获取每一位数,tt用来得到乘完的下一个数 
        	//cnt记录几次 
            int temp=x,tt=1;
            while(temp!=0)
            {
                tt*=temp%10;
                temp/=10;
            }
            x=tt;
            cnt++;
        }
        maxx=max(maxx,cnt);
     	q[cnt].push(i);
    }
     
    
    cout<<maxx<<endl;
    cout<<q[maxx].front();
    q[maxx].pop();
    while(!q[maxx].empty()) {
    	cout<<" "<<q[maxx].front();
    	q[maxx].pop();
	}
    
}

signed main(){
	int t=1;
	//cin>>t;
	while(t--) solve();
	return 0;
}

7-8 九宫格
这题其实就是遍历行和列和宫位就行,但是遍历宫位会比较麻烦一点,参考上述的知识点就行,我也是赛后才发觉可以这样,还是练的不够

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
    int a[10][10];

    for(int i=1;i<=9;i++)
    for(int j=1;j<=9;j++) cin>>a[i][j];
    
    //检查宫位 
    for(int i=1;i<=7;i+=3)
    {
    	for(int j=1;j<=7;j+=3)
    	{
    		map<int,int>mp;
    		for(int x=i;x<i+3;x++)
    		{
    			for(int y=j;y<j+3;y++)
    			{
    				mp[a[x][y]]++;
    				if(mp[a[x][y]]>1||a[x][y]>9){
    					cout<<0<<endl;
    					return ;
					}
				}
			}
			for(int xx=1;xx<=9;xx++){
			if(mp[xx]!=1) {
				cout<<0<<endl;
				return;
			}
			
		}
	}
    
    //检查行
	for(int i=1;i<=9;i++)
	{
		map<int,int>mp;
		for(int j=1;j<=9;j++)
		{
			mp[a[i][j]]++;
			if(a[i][j]>9||mp[a[i][j]]>1){
				cout<<0<<endl;
				return ;
			}
		}
		for(int xx=1;xx<=9;xx++){
			if(mp[xx]!=1) {
				cout<<0<<endl;
				return;
			}
		}
	 } 
	 
	 //检查列 
	for(int i=1;i<=9;i++)
	{
		map<int,int>mp;
		for(int j=1;j<=9;j++)
		{
			mp[a[j][i]]++;
			if(a[j][i]>9||mp[a[j][i]]>1){
				cout<<0<<endl;
				return ;
			}
		}
		for(int xx=1;xx<=9;xx++){
			if(mp[xx]!=1) {
				cout<<0<<endl;
				return;
			}
		}
	 } 

}
cout<<1<<endl;
}
signed main(){
	int t=1;
	cin>>t;
	while(t--) solve();
	return 0;
	
}

7-9 鱼与熊掌
这道题用食物去匹配人才是正解,因为我们每次验证的时候只取两个食品,然后看同时拥有的有多少个人,这样的话我们开二维数组行标代表食物的种类,然后每行存对应的人,这样验证就很快了

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
    int n,m;
    cin>>n>>m;
    vector<int>ve[100005];
    //要用动态的不然过不去 其实不用也行 
    for(int i=1;i<=n;i++)
    {
        int k;
        cin>>k;
        while(k--)
        {
            int x;
            cin>>x;
            //用食物来匹配人就好遍历了
			//因为每次食物只有两个 
            ve[x].push_back(i);
        }
    }  

    int s;
    cin>>s;
    while(s--)
    {
        int a,b,ans=0;
        cin>>a>>b;
        for(int i=0;i<ve[a].size();i++)
        {
        	for(int j=0;j<ve[b].size();j++)
        	{
        		if(ve[a][i]==ve[b][j]){
        			//这里记得要break出来,才能保证一个数只和它相等的匹配一次 
        			ans++;
        			break;
				}
			}
		}
        cout<<ans<<endl;
        
    }


    
}

signed main(){
	int t=1;
	//cin>>t;
	while(t--) solve();
	return 0;
}

7-10 懂蛇语

使用上述知识点2,然后我们记录每个字母首位组成的字符串作为标记,一个字母前面是空格就一定是首字母,注意开头可能是空格,然后就是字典序的输出,也可以用sort来进行排序

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
map<string,multiset<string> >mp;
//使用multiset可以让放的字符串按字母序排
//map里面这样放可以实现首字母相同的句子的存放
string trans(string &s)//获取首字母组成的字符串
{
    string ans;
    //开头可能是空格
    if(s[0]!=' ') ans+=s[0];
    for(int i=0;i<s.size();i++)
    {
        //一个字母前面是空格那就是词字母
        if(s[i-1]==' '&&s[i]>='a'&&s[i]<='z')
        {
            ans+=s[i];
        }
    }
    return ans;
    
}

void solve()
{
       int n;
       cin>>n;
        cin.ignore();
        for(int i=1;i<=n;i++)
        {
            string str;
            getline(cin,str);
            string head=trans(str);
            mp[head].insert(str);
        }

        int k;
        cin>>k;
        cin.ignore();
       while(k--)
       {
           string str;
           getline(cin,str);
           string head=trans(str);

           if(mp[head].size()==0){
               cout<<str<<endl;
               continue;
           }
		
			//添上| 
           int idx=0;
           for(auto it:mp[head]){
                if(idx++!=0) cout<<"|";
                cout<<it;
           }
           cout<<endl;
       }
    
}

signed main(){
	int t=1;
	//cin>>t;
	while(t--) solve();
	return 0;
}

7-11 满树的遍历
待我学习一下树的知识点再来补

posted on 2024-04-24 18:04  swj2529411658  阅读(145)  评论(0编辑  收藏  举报

导航