L1-6 吃火锅 (15分)
题解:
用find()函数在字符串里查找子字符串
用find()函数查找“chi1 huo3 guo1”
STL中的find()函数,提供了强大的功能。
当我们判断一个字符串是否包含另一个字符串的时候,可以使用find();
string::size_type idx;//结果会返回一个这个类型的值
idx=a.find(b);//在a中查找b.
if(idx == string::npos )//不存在。
cout << "not found\n";
else//存在。
cout <<"found\n";
idx=a.find(c);//在a中查找c。
if(idx == string::npos )//不存在。
cout << "not found\n";
else//存在。
cout <<"found\n";
}
上述的idx类型转化成int类型.
int idx = 0;//定义成这个int类型就会返回这个int类型
idx = str1.find(str2);
cout<<"index_str2 = "<<idx<<endl;
idx = str1.find(str3);
cout<<"index_str3 = "<<idx<<endl;
代码:
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int main()
{
string t="chi1 huo3 guo1";
string t1;
int sum=0,sumh=0;
int first=0;
while(getline(cin,t1))
{
if(t1==".")
{
break;
}
sum++;
int idx;
idx=t1.find(t);
if(idx!=-1)
{
if(sumh==0)
{
first=sum;
}
sumh++;
}
}
if(sumh==0)
{
cout<<sum<<endl;
cout<<"-_-#"<<endl;
}
else
{
cout<<sum<<endl;
cout<<first<<" "<<sumh<<endl;
}
}
L2-1 简单计算器 (25分)
题解:
这是一个很简单的题,用栈解决
设置两个栈,用STL里面的stack函数
建立一个栈stack < 类型 > s //例如 stack<int> s
加入一个新的元素s.push( a )
询问栈顶元素s.top()
弹出栈顶元素s.pop()
栈里面有多少个元素s.size()
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
stack<int> s1;
stack<char> s2;
for(int i=0;i<n;i++)
{
int m;
cin>>m;
s1.push(m);
}
for(int i=0;i<n-1;i++)
{
char a;
cin>>a;
s2.push(a);
}
while(s2.size()!=0)
{
int n1,n2;
n1=s1.top();
s1.pop();
n2=s1.top();
s1.pop();
char a1=s2.top();
s2.pop();
if(a1=='/')
{
if(n1==0)
{
cout<<"ERROR: "<<n2<<"/0"<<endl;
break;
return 0;
}
else
{
int sum=n2/n1;
s1.push(sum);
//cout<<sum<<endl;
}
}
if(a1=='-')
{
int sum=n2-n1;
s1.push(sum);
//cout<<sum<<endl;
}
if(a1=='+')
{
int sum=n1+n2;
s1.push(sum);
//cout<<sum<<endl;
}
if(a1=='*')
{
int sum=n1*n2;
s1.push(sum);
//cout<<sum<<endl;
}
if(s1.size()==1)
{
cout<<s1.top()<<endl;
break;
}
}
}
L2-3 完全二叉树的层序遍历 (25分)
题解:
由后序遍历推出完全二叉树
再层序遍历输出
两个模板
后序生成树
//后序生成树
node *create_LRV_LVR(int L, int R)
{
if(L>R||L<0||R<0)
{
//cout<<0<<endl;
return NULL;
}
node *root=new node;
root->data=bhd[R];
int lg=R-L;
int LR,RR;
if(lg%2==0)
{
LR=L+(lg/2)-1;
}
else
{
LR=L+lg/2;
}
RR=R-lg/2;
root->lchild=create_LRV_LVR(L,LR);
root->rchild=create_LRV_LVR(RR,R-1);
return root;
}
层序遍历输出
//层序遍历函数
void leveorder(node* root)
{
node* Q[MAXN],*q=NULL;
int front=-1,rear=-1;
if(root==NULL)
{
cout<<endl;
return;
}
Q[++rear]=root;
int falg=0;
while(front!=rear)
{
q=Q[++front];
if(falg==0)
{
cout<<q->data;
falg++;
}
else
{
cout<<" "<<q->data;
falg++;
}
if(q->lchild!=NULL)
{
Q[++rear]=q->lchild;
}
if(q->rchild!=NULL)
{
Q[++rear]=q->rchild;
}
}
}
代码:
#include<bits/stdc++.h>
using namespace std;
const long long MAXN = 1e5 + 7;
struct node
{
int data;
node* lchild;
node* rchild;
};
int bhd[MAXN]; //后序
//后序生成树
node *create_LRV_LVR(int L, int R)
{
if(L>R||L<0||R<0)
{
//cout<<0<<endl;
return NULL;
}
node *root=new node;
root->data=bhd[R];
int lg=R-L;
int LR,RR;
if(lg%2==0)
{
LR=L+(lg/2)-1;
}
else
{
LR=L+lg/2;
}
RR=R-lg/2;
root->lchild=create_LRV_LVR(L,LR);
root->rchild=create_LRV_LVR(RR,R-1);
return root;
}
//层序遍历函数
void leveorder(node* root)
{
node* Q[MAXN],*q=NULL;
int front=-1,rear=-1;
if(root==NULL)
{
cout<<endl;
return;
}
Q[++rear]=root;
int falg=0;
while(front!=rear)
{
q=Q[++front];
if(falg==0)
{
cout<<q->data;
falg++;
}
else
{
cout<<" "<<q->data;
falg++;
}
if(q->lchild!=NULL)
{
Q[++rear]=q->lchild;
}
if(q->rchild!=NULL)
{
Q[++rear]=q->rchild;
}
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>bhd[i];
}
node* root=create_LRV_LVR(0,n-1);
leveorder(root);
}
L2-4 网红点打卡攻略 (25分)
题解:
用二维数组储存两个点的路径
(但是还是有一个点没有通过)
#include<bits/stdc++.h>
using namespace std;
const long long MAXN = 300;
int num[MAXN][MAXN];
int v[MAXN];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
num[i][j]=-1;
}
}
for(int i=0;i<m;i++)
{
int n1,n2,num1;
cin>>n1>>n2>>num1;
num[n1][n2]=num1;
num[n2][n1]=num1;
}
int k;
cin>>k;
long long minn=100000000001;
int minm=0;
int sum=0;
for(int d=0;d<k;d++)
{
int nn;
cin>>nn;
int falg=0;
int sum1=0;
for(int i=0;i<nn;i++)
{
cin>>v[i];
}
if(nn==n)
{
set<int> s;
for(int j=0;j<nn;j++)
{
if(v[j]!=0)
{
s.insert(v[j]);
}
}
if(s.size()==n)
{
int k1=v[0];
int kn=v[nn-1];
if(num[k1][0]!=-1&&num[kn][0]!=-1)
{
falg=1;
sum++;
}
}
}
if(falg==1)
{
for(int i=0;i<n-1;i++)
{
sum1=sum1+num[v[i]][v[i+1]];
}
sum1=sum1+num[v[0]][0]+num[v[nn-1]][0];
if(sum1<minn)
{
minn=sum1;
minm=d+1;
}
}
}
cout<<sum<<endl;
if(n==0)
{
cout<<0<<" "<<0<<endl;
}
else
{
cout<<minm<<" "<<minn<<endl;
}
}
这是从网上找的大佬的满分代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m;
int cost[202][202];
memset(cost, -1, sizeof(cost));
cin >> n >> m;
while (m--)
{
int x, y, cos;
cin >> x >> y >> cos;
cost[x][y] = cost[y][x] = cos; //毕竟无向图嘛,所以双向都存一下价格(权值)
}
int k;
cin >> k;
long long ft = -1, sum = 0, minn = 1e9; //ft 花“废”最少的的攻略的序号, sum 满足要求的攻略个数, minn 顾名思义~
for (int j = 1; j <= k; j++)
{
int t;
set<int> check; //用来检查有没有偷懒导致的某些景点没去过~
cin >> t;
int a[204];
for (int i = 1; i <= t; i++)
{
cin >> a[i];
check.insert(a[i]);
}
a[0] = a[t + 1] = 0; //所谓回路,就是必须从家出发并且回到家~
if (check.size() != n || t != n) //“能在每个网红点打卡仅一次”
{
continue;
}
int cos = 0;
for (int i = 0; i <= t; i++)
{
if (cost[a[i]][a[i + 1]] != -1) //如果是-1那就说明这条路是走不通的直接退出就好了
{
cos += cost[a[i]][a[i + 1]];
}
else
{
cos = -1;
break;
}
}
if (cos != -1)
{
if (cos < minn)
{
minn = cos;
ft = j;
}
sum++;
}
}
cout << sum << endl
<< ft << " " << minn;
return 0;
}