【LGR-191-Div.4】洛谷入门赛 #24

【LGR-191-Div.4】洛谷入门赛 #24

\(A\) luogu B3984 [语言月赛 202406] 编程学习 AC

  • \(\left\lceil\frac{y-x}{2}\right\rceil\) 即为所求,搞不懂为什么 \(10^{18}\) 就把 long double 放过去,担心精度的话做法同 [ABC345B] Integer Division Returns ,代码写的做法是后者。

    点击查看代码
    int main()
    {
        ll x,y;
        cin>>x>>y;
        cout<<(y-x+1)/2<<endl;
        return 0;
    }
    

\(B\) luogu B3985 [语言月赛 202406] 气球 AC

  • 条件语句。

    点击查看代码
    int main()
    {
        int x,i;
        for(i=1;i<=3;i++)
        {
            cin>>x;
            if(x==1)
            {
                cout<<"B";
            }
            if(x==2)
            {
                cout<<"Y";
            }
            if(x==3)
            {
                cout<<"R";
            }
        }
        return 0;
    }
    

\(C\) luogu B3986 [语言月赛 202406] 小 Z 的 Z 矩阵 AC

  • 循环语句。

    点击查看代码
    int main()
    {
        int n,i,j;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            if(i==1||i==n)
            {
                for(j=1;j<=n;j++)
                {
                    cout<<"Z";
                }
            }
            else
            {
                for(j=1;j<=n;j++)
                {
                    if(j==n-i+1)
                    {
                        cout<<"Z";
                    }
                    else
                    {
                        cout<<"-";
                    }
                }
            }
            cout<<endl;
        }
        return 0;
    }
    

\(D\) luogu B3987 [语言月赛 202406] 朋友数列 AC

  • 由于 \(|a_{i}|,|b_{i}| \le 10^{9}\) ,而 \(a_{i}+b_{i}\) 取极大或极小值可能无法满足 \(|b_{i}| \le 10^{9}\) 的条件,故折中取 \(a_{i}+b_{i}=0\) 即可,即 \(b_{i}=-a_{i}\)

    点击查看代码
    int main()
    {
        ll n,x,i;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            cin>>x;
            cout<<-x<<" ";
        }
        return 0;
    }
    

\(E\) luogu B3988 [语言月赛 202406] 天然气计价 AC

  • 条件语句,同 luogu B2047 分段函数 | luogu B2048 计算邮资

  • 对应每一个新的月份均重新计算当前总费用,减去上个月及之前的即为所求。

    点击查看代码
    int main()
    {
        double x,y,sum=0,last=0;
        for(int i=1;i<=12;i++)
        {
            cin>>x;
            sum+=x;
            y=0;
            if(0<=sum&&sum<=310)
            {
                y=sum*3;
            }
            else
            {
                if(sum<=520)
                {
                    y=(sum-310)*3.3+310*3;
                }
                else
                {
                    y=(sum-520)*4.2+310*3+210*3.3;
                }
            }
            printf("%.1lf\n",y-last);
            last=y;
        }
        return 0;
    }
    

\(F\) luogu B3989 [语言月赛 202406] 优惠券

  • 从贪心的角度分析,我们可能需要尽可能多地使用优惠券,这就需要我们尽可能多地获得优惠券。

  • \(a\) 升序排序后,枚举获得的优惠券张数 \(i\) ,同时这些优惠券一定来自前 \(i\) 杯奶茶。

  • 最终,有 \(\min\limits_{i=1}^{n} \{ \sum\limits_{j=1}^{n}a_{i}-\min(i,\sum\limits_{j=i+1}^{n}a_{j}) \}\) 极为所求。

    点击查看代码
    int a[1010],sum[1010];
    int main()
    {
        int n,ans=0x7f7f7f7f,i;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
            sum[i]=sum[i-1]+a[i];
        }
        for(i=1;i<=n;i++)
        {
            ans=min(ans,sum[n]-min(i,sum[n]-sum[i]));
        }
        cout<<ans<<endl;
        return 0;
    }
    

\(G\) luogu B3990 [语言月赛 202406] 通配符匹配

  • 枚举左端点,暴力比较即可。

    点击查看代码
    char s[1010],t[1010];
    int main()
    {
        int lens,lent,sum=0,l,r,i;
        cin>>(s+1)>>(t+1);
        lens=strlen(s+1);
        lent=strlen(t+1);
        for(l=1,r=lent;r<=lens;l++,r++)
        {
            sum=0;
            for(i=1;i<=lent;i++)
            {
                sum+=(s[l+i-1]==t[i]||s[l+i-1]=='?'||t[i]=='?');
            }
            if(sum==lent)
            {
                cout<<l<<" "<<r<<endl;
            }
        }
        return 0;
    }
    

\(H\) luogu B3991 [语言月赛 202406] 数组交换 AC

  • 加强版: luogu B3977 [语言月赛 202405] 更好的交换

    • 不是很理解入门赛本月出上月的题的弱化,上月的题是去年春测的题的弱化是什么意思。

    • 类似 luogu P9117 [春季测试 2023] 涂色游戏 ,记录两个数组分别存储第 \(i\) 行/列当前元素是原本哪一行/列的元素即可。

      点击查看代码
      int a[1010][1010],p[1010],q[1010];
      int main()
      {
          int n,m,pd,x,y,i,j;
          cin>>n>>m;
          for(i=1;i<=n;i++)
          {
              p[i]=q[i]=i;
              for(j=1;j<=n;j++)
              {
                  cin>>a[i][j];
              }
          }
          for(i=1;i<=m;i++)
          {
              cin>>pd>>x>>y;
              if(pd==1)
              {
                  swap(p[x],p[y]);
              }
              if(pd==0)
              {
                  swap(q[x],q[y]);
              }
          }
          for(i=1;i<=n;i++)
          {
              for(j=1;j<=n;j++)
              {
                  cout<<a[p[i]][q[j]]<<" ";
              }
              cout<<endl;
          }
          return 0;
      }
      
  • 暴力交换行、列即可。

    点击查看代码
    char a[1010][1010];
    int main()
    {
        int n,m,q,pd,x,y,i,j;
        cin>>n>>m>>q;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                cin>>a[i][j];
            }
        }
        for(i=1;i<=q;i++)
        {
            cin>>pd>>x>>y;
            if(pd==1)
            {
                for(j=1;j<=m;j++)
                {
                    swap(a[x][j],a[y][j]);
                }
            }
            if(pd==2)
            {
                for(j=1;j<=n;j++)
                {
                    swap(a[j][x],a[j][y]);
                }
            }
            if(pd==3)
            {
                cout<<a[x][y]<<endl;
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                cout<<a[i][j];
            }
            cout<<endl;
        }
        return 0;
    }
    

总结

  • 开题顺序: \(ABCDEFHGF\)
  • 写这场比赛的时候,一开始机房的 luogu “经常性”地被毙,只有 @5k_sync_closer 的口述题面;加以正在开三模总结大会,开完大会(晚一下课后)就溜了,导致整场比赛的参加时间不超过半小时。
  • \(D\) :结论一眼没看出来,吃了发罚时。
  • \(E\) :没看见 年用气量 ,一边写假代码一边还在好奇为啥这么便宜,测完样例重读一遍题后才看见。
  • \(F\) :当时以为是什么高级结论想了一晚上也没想出来,离谱。
  • \(G\) :以为比较的是 \(s,t\) 的子段,把题想麻烦了不少。
posted @ 2024-06-24 21:56  hzoi_Shadow  阅读(120)  评论(0编辑  收藏  举报
扩大
缩小