知识点模块
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
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 满树的遍历
待我学习一下树的知识点再来补