2020天梯赛补题

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值