知识点模块
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 九宫格输入法
我们开vector
点击查看代码
#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;
}