首页 > 其他分享 >天梯赛训练总结

天梯赛训练总结

时间:2024-04-20 21:01:18浏览次数:30  
标签:总结 string 训练 int cin long while solve 天梯

知识点模块

1.当我们需要检验一个子串在字符串中出现的次数的时候,如果是不计大小写的,那么我们可以按要求把它全部转化为小写,比如我们要求gpt Gpt GpT等总共的出现次数,先将其化为小写
for(auto &c:s) c=tolower(c)
2.寻找出现次数有两种方法,可以根据复杂度验证后选择
第一种方法是用find函数,循环更新pos位置

点击查看代码
size_t pos=0;
int cnt=0;
while( ( pos=s.find(subs,pos) )!=s.npos )//注意括号的位置
{
    pos+=subs.size();
    cnt++;
}

第二种方法是枚举端点验证

点击查看代码
for(int i=0;i+subs.size()-1<s.size();i++)
{
    cnt+=(s.substr(i,subs.size())=="chatgpt")
}
//我们这是放方法,具体的时候要把这些size改为数字

3.使用map计数完毕以后,如果想要让其按照值来排序我们可以选择把map复制到vector里

点击查看代码
for(auto &[id,x]:mp)
{
  ve.emplace_back(id,x);//根据对应的类型放哈,我这是举了个例子
}

4.如果要对字符串和值 这样配对的点进行排序,也是可以使用优先队列的,优先队列里面放pair<int,string>,优先队列就可以按照int默认从大到小排序,如果你想让其从小到大排序,你可以添个负号
priority_queue<pair<int,string> >q

5.在遇到让你一直输入的题型,其实是可以按下面这么写的
while(cin>>s){ }

6.删除前导0可以按这样的操作来

点击查看代码
l=s.size();
int st=0,i=0;//st是开始输出字符串的位置,用来跳过前导0;省的删除 
	//st<l-1是为了防止10啥也不输出 
	while(s[i]=='0'&&st<l-1)
	{
		st++;
		i++; 
	}
	for(int i=st;i<l;i++) cout<<s[i];

7.substr函数
s.substr(7)含义是截取从位置7到字符串末尾的子串

8.三个数找最大值可以写成
max({a,b,c})

题解部分

7-3 通讯录的录入与显示
开4个string数组来存即可,注意输入的整数可能小于0

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
    
    int n;
    cin>>n;
    string name[15],rq[15],xb[15],zj[15],dh[15];
    for(int i=0;i<n;i++)
    {
        cin>>name[i]>>rq[i]>>xb[i]>>zj[i]>>dh[i];
    }
    int k;
    cin>>k;
    while(k--)
    {
        int x;
        cin>>x;
        if(x>=n||x<0){
            cout<<"Not Found"<<endl;
            
        } 
        else {
            cout<<name[x]<<" "<<zj[x]<<" "<<dh[x]<<" "<<xb[x]<<" "<<rq[x]<<endl;
          
        }
    }<details>
<summary>点击查看代码</summary>

</details>
    
    
    
}

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

7-5 出生年

从输入的数开始枚举到3002,反正大于3000就行,一边枚举一边验证,如果符合就是答案,跳出循环,但是注意条件,输入的数有的是需要补0的,我们枚举的时候把这个数转为字符串,然后对该字符串的每一位放到一个set里,如果set的size满足要求即可跳出

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
    int x,n;
    map<string,int>mp;
    cin>>x>>n;
    int ans;
    
    string ansstr;
    for(int i=x;i<=3100;i++)
    {
        set<char>se;
        string sb;
        bool check=1;
        sb=to_string(i);
        
        string zero;
        if(sb.size()<4){
            int cnt=4-sb.size();
            while(cnt--) zero+='0';
        }
        zero+=sb;
        
        for(int j=0;j<zero.size();j++)
        {
            se.insert(zero[j]);
        }
        
        //cout<<se.size();
        if(se.size()==n){
            ans=i;
            ansstr=zero;
            break;
        }
        
   }
   cout<<ans-x<<" "<<ansstr;
    
    
    
    
}

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

7-6 九宫格输入法

我们开vectorve来放0-9的字符,但是注意条件中的循环输入,还有读取的时候下标是从0开始的

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
	vector<string>ve={"0 ","1,.?!","2ABC","3DEF","4GHI","5JKL","6MNO","7PQRS","8TUV","9WXYZ"};
	string s;
	while(cin>>s)
	{
		cout<<ve[s.front()-'0'][(s.size()-1)%ve[s.front()-'0'].size()];//ve中每组的下标从0开始,所以是size-1再来取余 
	}
}

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

7-9 Windows消息队列
这题要用到知识点4,排序以后思路就非常清晰简单了

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,string> pis;
void solve()
{
	priority_queue<pis> q;
	int n;
	cin>>n;
	while(n--)
	{
		string sb;
		cin>>sb;
		if(sb=="PUT"){
			string key;
			int val;
			cin>>key>>val;
			q.push({-val,key});//优先队列按从小到大排序,想让它反着添负号就行 
		}
		else {
			if(q.empty()) cout<<"EMPTY QUEUE!"<<endl;
			else{
				auto t=q.top();
				q.pop();
				cout<<t.second<<endl;
			}
		}
		
	}
}

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

7-10 名人堂与代金券

题意还是很好理解的,卡点就在于你如何处理输出时候的序号,学习一下处理输出的时候

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<string,int> psi;
bool cmp(psi a,psi b)
{
	if(a.second!=b.second) return a.second>b.second;
	else return a.first<b.first;
}

void solve()
{
	int n,g,k;
	cin>>n>>g>>k;
	vector<psi>ve(n);
	int sum=0;
	for(int i=0;i<n;i++)
	{
		cin>>ve[i].first>>ve[i].second;
		int x=ve[i].second;
		if(x<g&&x>=60) sum+=20;
		else if(x>=g&&x<=100) sum+=50;
	}
	
	sort(ve.begin(),ve.end(),cmp);
	cout<<sum<<endl;
	//这部分还是得学习一下的	
	int lst=-1;
	for(int i=0;i<n;i++)
	{
		if(ve[i].second!=ve[i-1].second||i==0) {
			lst=i+1;
			if(lst>k) break;
			cout<<lst<<" "<<ve[i].first<<" "<<ve[i].second<<endl;
		}
		else if(ve[i].second==ve[i-1].second){
			cout<<lst<<" "<<ve[i].first<<" "<<ve[i].second<<endl;
		}
		
	}
	
	
	
	
		
}

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

L2-2 含茶量
这题我们先把所有的字母转化为小写字母以后,再进行查找统计其出现的次数,使用map统计完次数以后,把map的元素复制到vector里面,然后对其进行整理以后再按要求输出,学习知识点2和知识点很重要

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<string,int> psi;
bool cmp(psi a,psi b)
{
	if(a.second!=b.second) return a.second>b.second;
	else return a.first<b.first;
}

void solve()
{
	int n;
	cin>>n;
	map<string,int>mp;
	while(n--)
	{
		string x;
		string id;
		cin>>x;
		cin.ignore();//吃掉回车
		getline(cin,id);
		for(auto &c:id) c=tolower(c);
		/*for(int i=0;i+6<id.size();i++)
		{
			mp[x]+=(id.substr(i,7)=="chatgpt");
		}*/
		int cnt=0;
        size_t pos=0;
        while(( pos=id.find("chatgpt",pos) )!=id.npos)//注意括号 括号 括号
        {
            cnt++;
            pos+=7;
        }
		mp[x]+=cnt;

	}
	
	vector<pair<string,int> >ve;
	for(const auto &[id , x] : mp)
        if(x > 0) ve.emplace_back(id, x);
	
	
	sort(ve.begin(),ve.end(),[&](const auto&a,const auto &b){
		if(a.second!=b.second) return a.second>b.second;
		return a.first<b.first;
	});
	
    if(ve.size()<3)
	for(auto t:ve)
	{
		cout<<t.first<<" "<<t.second<<endl;
	}
	else {
	    int cnt=0;
	    for(auto t:ve)
	    {
	        cout<<t.first<<" "<<t.second<<endl;
	        cnt++;
	        if(cnt==3) break;
	    }
	}
	
}

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

L1-8 小偷踩点
老样子map存string,然后开个数组先把所有值赋值为-1,然后再对查询的数进行处理,因为只有两个数,取余和除即可,然后查找即可

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

void solve()
{
	int n,m;
	cin>>n>>m;
	map<int,string>mp;
	cin.ignore();
	for(int i=1;i<=n;i++)
	{
		string sb;
		getline(cin,sb);
		mp[i]=sb;

	}
	
	int ve[15][15]={0};
	vector<int>a(15);
	for(int i=1;i<=m;i++)
	{
		cin>>a[i];
	}
	
	for(int i=0;i<15;i++)
	{
		for(int j=0;j<15;j++) ve[i][j]=-1;
	}
	
	
	for(int i=1;i<=m;i++)
	{
		for(int j=0;j<=9;j++)
		{
			cin>>ve[a[i]][j];
		}
	}
	
	int k;
	cin>>k;
	while(k--)
	{
		int x;
		cin>>x;
		int r=x/10,c=x%10;
		int id=ve[r][c];
		
		if(id==-1) cout<<"?"<<endl;
		else {
			cout<<mp[id]<<endl;
		}
	//	cout<<id<<endl;
	}
	
	
	
	
}

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

L1-6 剪切粘贴
思路就是获取完子串后对字符串进行截取,用到erase函数,注意截取的下标是输入的位置-1,然后在我们寻找插入位置时,直接找这两个拼起来是否是存在的,如果不存在直接把截取的加到末尾,存在的话我们在把这个子串通过拼接的方式实现插入

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

void solve()
{
	//注意题目的下标左端点
    string s;
    int n;
    cin>>s>>n;
    while(n--)
    {
      string a,b;
        int l,r;
        cin>>l>>r>>a>>b;
        string T=s.substr(l-1,r-l+1);
        s.erase(l-1,r-l+1);
        int pos=s.find(a+b);
        if(pos==-1) s+=T;
        else{
        s=s.substr(0,pos+(int)a.size())+T+s.substr(pos+(int)a.size());
            //学习一下第二个substr的使用
        }
    }
	cout<<s;
	
}

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

L1-7 分寝室
我们枚举每间宿舍女生的人数即可,然后逐步验证,先验证这个人数是否可以被女生总人数整除和这个宿舍数量是否是整数,然后再验证男生人数是否可以整除,宿舍是否合理即可,然后注意一下最小差值的更新

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

void solve()
{
	//注意题目的下标左端点
   int n0,n1,n,f=0,m;
   cin>>n0>>n1>>n;
	for(int i=2;i<=n0;i++)
	{
		if(n0%i!=0||n0/i>=n) continue;//可以整除且整除后不大于n才继续
		int j=n-n0/i;//j为男生间数
		if(n1%j!=0) continue;
		//可以更新的条件 
		if(f==0||abs(i-n1/j)<abs(n0/f-n1/m))//f为女生间数,m为男生间数 
		{
			f=n0/i;
			m=j;
		}
	}
	
	if(f>0) cout<<f<<" "<<m;
	else cout<<"No Solution";
	
}

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

L1-8 谁管谁叫爹
这一题按照题意模拟即可

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

void solve()
{
	int a,b;
    cin>>a>>b;
    int ya=a,yb=b;
    int suma=0,sumb=0;
    while(a!=0)
    {
        suma+=a%10;
        a/=10;
    }
    
    while(b!=0)
    {
        sumb+=b%10;
        b/=10;
    }
 //   cout<<suma<<" "<<sumb<<endl;
    
	if(ya%sumb==0&yb%suma!=0) cout<<"A"<<endl;
	else if(yb%suma==0&&ya%sumb!=0) cout<<"B"<<endl;
	else {
		if(ya>yb) cout<<"A"<<endl;
		else cout<<"B"<<endl;
	}
    
	
}

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

L2-1 堆宝塔
按照题意一点一点敲,但是注意不要放在void solve()里面会爆栈,直接再main()里面敲代码即可

点击查看代码
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define endl '\n'
stack<int>a, b;
int arr[2000];

int main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n,cnt=0,maxh=0;
	
    cin>>n;
    for(int i=1;i<=n;i++) cin>>arr[i];
    a.push(arr[1]);
    
    
    for(int i=2;i<=n;i++)
    {
            if(arr[i]<a.top()) a.push(arr[i]);
            else{
                if(b.empty()||b.top()<arr[i]) b.push(arr[i]);
                else{
                    	int lsa=a.size();
                        maxh=max(maxh,lsa);

                        while(!a.empty()) a.pop();
                    	cnt++;
                    while(b.top()>arr[i]&&!b.empty())
                    {

                        a.push(b.top());
                        b.pop();  
                    }
                    a.push(arr[i]);
                    
                }
            }
         
        }

   /* if(!a.empty()) cnt++;
    maxh=max(maxh,(int)a.size());
    if(!b.empty()){
        cnt++;
        maxh=max(maxh,(int)b.size());
    }*/
    
    int la=a.size(),lb=b.size();
    maxh=max({la,lb,maxh});
    if(a.size()) cnt++;
    if(b.size()) cnt++;
    
    
    cout<<cnt<<" "<<maxh<<endl;
	
	return 0;
}

标签:总结,string,训练,int,cin,long,while,solve,天梯
From: https://www.cnblogs.com/swjswjswj/p/18139556

相关文章

  • 关于发布题目集1~3的总结性Blog
    前言:这几次关于答题判题程序是通过从键盘中输入提取出对应的信息(比如说题目,试卷,答卷等等)然后再进行逐一判断。从中考查的知识点是正则表达式的运用,加上了split函数的运用,类的数组运用等等。主要的还是这三点。由于一直的迭代,导致最终它的题目要求越来越多,导致难度直线上升。也从8......
  • Random 项目总结 -03测试链接按钮 测试数据链接
    注意:如果填写地址是指定端口IP地址与端口之间需要用逗号隔开。 privatevoidbutton2_Click(objectsender,EventArgse){stringstrdata=textBox1.Text;stringstrsa=textBox2.Text;stringstrpwd=textBox3.Text;......
  • Random 项目总结 -登录按钮 读取XML文件判断用户、密码是否正确
      一、登录按钮privatevoidbutton1_Click(objectsender,EventArgse){stringxmlpath=System.AppDomain.CurrentDomain.BaseDirectory+"setting.xml";XmlDocumentdocx=newXmlDocument();docx.Load(xmlpath);......
  • Random 项目总结 -设置按钮 设置数据库地址, 用户密码写入XML
    privatevoidbutton1_Click(objectsender,EventArgse){stringxmlpath=System.AppDomain.CurrentDomain.BaseDirectory+"setting.xml";XmlDocumentxmldoc=newXmlDocument();xmldoc.Load(xmlpath);......
  • 题目集1~3的总结性Blog
    一、前言第一次题集知识点主要是掌握类和对象的使用创建,以及类与类之间的关系,还有正则表达式的运用,动态数组ArrayList类的使用,以及方法。这一次的题集难度不是很大,因为是第一次所以来说题量有点大。也是艰难完成了。第二次题集知识点与第一次的类似主要还是对正则表达式的使......
  • (数据结构代码,总结,自我思考)=> { return 个人学习笔记; } 【To be continued~】
    俗话说“学而不思则罔”,是时候复习和整理一下自己先前的学习历程了!Chapter-One《BinarySearch》publicstaticintbinarySearch(int[]a,inttarget){inti=0,j=a.length-1;while(i<=j){intm=(i+j)>>>1;//求......
  • OOP课程·PTA题目集1-3总结
    一.前言第一次pta比较简单,主要考察了类的关联与依赖,只有一道大题与4个小题第二次pta比较难,主要考察了类设计,有一道大题与3个小题第三次pta较难,主要考察了类设计,日期类的基本使用,有2个小题与1个大题二.设计与分析第一次题目集7-1设计一个风扇Fan类源码:点击查看代码......
  • 天梯赛赛前总结
    某些函数后面有带小括号的注解,小括号中各参数的顺序就是传入的参数的顺序。stlqueue声明:queuename;(其他容器如无特别标注则声明方式与此相同)函数:front,back,empty,size,push,pop,swap(c++11)比较运算符:==,<=,>=,<,>,!=:按照字典序比较两个queue(c++20)priority_queue......
  • 基环树算法总结
    基环树算法总结一、什么是基环树基环树,顾名思义,有两个要素:环和树。因此,基环树就是一棵树的一个节点,扩成一个环,做题时,多棵基环树组成的基环树森林,常以如下方式出现:每个点只有一个出边。每个点只有一个入边。图中一共有\(n\)个点,\(n\)条边。那么,基环树类型的题目应该怎......
  • 掌握时间序列特征工程:常用特征总结与 Feature-engine 的应用
    时间序列数据的特征工程是一种技术,用于从时间序列数据中提取信息或构造特征,这些特征可用于提高机器学习模型的性能。以下是一些常见的时间序列特征工程技术:滚动统计量:计算时间窗口内的统计量,如平均值、中位数、标准偏差、最小值和最大值。这些统计量可以捕捉到时间序列在不同时......