天梯选拔赛第一场

这一场发挥的不好,交四题错三题,思路不对,题意理解的不好。
再接再厉

A 私人笑声
这一题为错在我老是觉得要整段整段的输出,其实可以输出每个s[i],只要遇到'.'我们输出xixixixi.,不是则输出原来的s[i]即可

点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
    string s;
    getline(cin,s);
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='.') cout<<".xixixixi.";
        else cout<<s[i];
    }

}
int main()
{
    solve();
    
}

B 孵化小鸡
这题学了一个新的知识点,二进制枚举,即可以用0和1来表示选或者不选的状态,感谢欧哥的指点,对每个鸡蛋验证是否可以达到他的临界值,下面的代码有详细的注解

点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
void solve()
{
    int n,m;
    cin>>n>>m;
    vector<int>a(101,-1);//放鸡蛋的区间
    for(int i=1;i<=n;i++)
    {
        int l,r,x;
        cin>>l>>r>>x;
        for(int j=l;j<=r;j++)
        {
            a[j]=x; //每个鸡蛋孵化所需的温度
        }
    }
    
    vector<int>p(m),k(m);//p存每个暖源的花费,k存每个暖源的加热值
    vector<pii>q(m);//q存每个暖源的加热范围,用左右点来存

    for(int i=0;i<m;i++)
    {
        cin>>q[i].first>>q[i].second;
        cin>>k[i]>>p[i];
    }
    
    int res=1e9;
    //然后开始进行二进制枚举和验证 1代表取这种暖源,2代表不取
    for(int sz=0;sz<(1<<m);sz++)//有2的m次方种情况
    {
        vector<int>b(101);//存每个暖源加热的每个位置的值
        int ans=0;
        
        for(int i=0;i<m;i++)
        {
            if((sz>>i)&1)//想象一下把如0010往右移动一位,两位,三位,四位,看其为0还是1
            {
                for(int j=q[i].first;j<=q[i].second;j++)
                {
                    b[j]+=k[i];//每个坑上升的温度
                }
                ans+=p[i];
                
            }
        }
        //验证是否每个鸡蛋都达到了要求的温度
        int st=1;
        for(int i=1;i<101;i++)
        {
            if(a[i]!=-1&&b[i]<a[i])
            {
                st=0;
                break;
            }
        }
        // 满足更新res;
        if(st) res=min(res,ans);
        
    }
    cout<<res;
}

int main()
{
    solve();
}

G 相加余三(easy)
这一题其实就是纯纯模拟,但是注意不要有细节上的错误

点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
    int n,sum1=0,sum2=0,sum3=0;
    cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    
    for(int i=2;i<=n;i+=2)
    {
        sum1+=(a[i]+a[i-1])%3;
        if(n-i<2) break;
    }
    
    for(int i=n;i>=1;i-=2){
        sum2+=(a[i]+a[i-1])%3;
        if(i<2) break;
    }
    sum2=max(sum1,sum2);
    
    for(int i=1,j=n;j-i+1>=2;i++,j--)
    {
        sum3+=(a[i]+a[j])%3;
    }
    sum3=max(sum2,sum3);
    
    cout<<sum3;

}
int main()
{
    solve();
    
}

J 最后都是0
这一题理解错题目的意思了,每一个自然数减掉一位数以后会变成另一个自然数,而不是一个数选了一个位数以后一直减到0,这题感谢牛哥,欧哥指点。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
    int n,ans=0;
    cin>>n;
    while(n!=0){
        int m=n;
        int max1=-1;
        while(m!=0)
        {
            max1=max(max1,m%10);
            m/=10;
        }
        n-=max1;
        ans++;
    }
    cout<<ans;
    
}
int main()
{
    solve();
}

D 划分田地(easy)
这题感谢韦学姐的指点,首先我们要明确是如何通过点去确定最小的矩形的,然后枚举每个点选或不选的情况,还是二进制枚举,但是可能会有重复的情况,所以我们可以使用set来避免,注意空集也算一个,两个点的x有最大最小值,y也有最大最小值,这就可以确定矩形,上图

这样便很好理解了

点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;

void solve()
{
  int n;
  cin>>n;
  vector<pii>ve(n);
  for(int i=0;i<n;i++) cin>>ve[i].first>>ve[i].second;
  
  set<vector<int>>se;
  for(int sz=1;sz<(1<<n);sz++)//从1开始代表不考虑点都不选的情况
  {
      vector<int>a(4);
      int x1=-1,x2=55,y1=-1,y2=55;
      for(int j=0;j<n;j++)
      {
          if((sz>>j)&1){
            x1=max(x1,ve[j].first) ;
            x2=min(x2,ve[j].first);
            y1=max(y1,ve[j].second);
            y2=min(y2,ve[j].second);  
          }
      }
      a[0]=x1,a[1]=y1,a[2]=x2,a[3]=y2;
      se.insert(a);
  }
    cout<<se.size()+1;
}
int main()
{
    solve();
}

L 加纳~
简单的模拟

点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
    int n,m,ans,k;
    cin>>n>>m;
    cin>>k;
    int cnt=k/n;
    if(k-cnt*n==m) ans=cnt+1;
    else ans=cnt;
    cout<<ans;
}


int main()
{
    solve();
    
    
}

posted on 2024-03-08 19:58  swj2529411658  阅读(17)  评论(0)    收藏  举报

导航