USACO铜组一些水题 找自信心用

铜组T1

铜1题面

这里写图片描述
很简单的水题吧。。
既然蒟蒻萝卜都过了,那么随便讲两句。
建立数组,下标表示犬编号,里面存犬的状态。每次读入进行比较,若改变,则ans++。

铜1题解

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,x,y,ans=0;
    cin>>n;
    int a[20];
    for(int i=1;i<=20;i++)
      a[i]=-1;
    for(int i=1;i<=n;i++)
      {
        cin>>x>>y;
        if (a[x]==-1) a[x]=y;
          else if (a[x]!=y) a[x]=y,ans++;
      }
    cout<<ans;
    return 0;
}
 
 

铜组T2

铜2题面

这里写图片描述
这里写图片描述

一开始蒟蒻萝卜的代码并没有正确,而是按照字母顺序进行比较是否包含,但经过一波生硬的检查,发现了问题。
这是样例图示
这里写图片描述

铜2题解

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int ru[30]={};
    int chu[30]={};
    char c;
    int ans=0;
    for(int i=1;i<=52;i++)
      {
        cin>>c;
        if (ru[c-'A'+1]!=0) chu[c-'A'+1]=i;
          else ru[c-'A'+1]=i;
      }
    for(int i=1;i<=26;i++)
      for(int j=1;j<=26;j++)
        if (ru[i]<ru[j]&&chu[i]>ru[j]&&chu[j]>chu[i]) 
          ans++;
    cout<<ans;
    return 0;
}
  
  
  • 铜组T3

    铜3题面

    这里写图片描述
    这里写图片描述
    建立结构体,以到达时间升序排序,模拟可过。

    铜3题解

    #include<bits/stdc++.h>
    using namespace std;
    struct cow
    {
        int t1,t2;
    }a[110]={};
    bool lb(cow x,cow y)
    {
        return x.t1<y.t1;
    }
    int main()
    {
        int n,x,y,t=0;
        cin>>n;
        for(int i=1;i<=n;i++)
          cin>>a[i].t1>>a[i].t2;
        sort(a+1,a+n+1,lb);
        for(int i=1;i<=n;i++)
          if (a[i].t1>t) t=a[i].t1+a[i].t2;
            else t=t+a[i].t2;
        cout<<t;
        return 0;
    }
        
        

    银组T1

    银1题面

    这里写图片描述
    这里写图片描述
    蒟蒻萝卜果然还是菜,到银组就各种爆0,MLE,TLE,WA。。。
    喜闻乐见。第一题就爆0了。。
    这里写图片描述
    QAQ
    这题是一道贪心
    结构体和数组分别存牛时间段与鸡时间点。
    牛以右端点排序。
    每只鸡对牛枚举,寻找能帮助的牛就行了

    银1题解

    #include<bits/stdc++.h>
    using namespace std;
    int n,c,ans=0;
    int a[20010]={};
    struct cow 
    {
        int zuo,you;
    }b[20010]={};
    inline bool mycmp(cow a1,cow a2)
    {
        return a1.you<a2.you;
    }
    inline void init()
    {
        cin>>c>>n;
        for(int i=1;i<=c;i++)
          cin>>a[i];
        for(int i=1;i<=n;i++)
          cin>>b[i].zuo>>b[i].you;
        sort(a+1,a+c+1);
        sort(b+1,b+n+1,mycmp);
    }
    inline void work()
    {
        for(int i=1;i<=c;i++)
          for(int j=1;j<=n;j++)
            if (a[i]>=b[j].zuo&&a[i]<=b[j].you)
              {
              ans++;
              b[j].zuo=-1;
              b[j].you=-1;
              break;
              }
    }
    int main()
    {
        init();
        work();
        cout<<ans;
        return 0;
    }
         
         
    • 银组T2

      银2题面

      这里写图片描述
      这里写图片描述
      这题是蒟蒻萝卜翻译的!!!!!
      有没有很玄学的,做题时想搓炉石的感觉!
      但自己翻译的题蒟蒻萝卜就拿了18分。。。
      没脸做萝卜了=_=

      诶。。
      其实只要标记损坏信号灯,从1到k建立一个小框框!!!不停枚举到n-k+1~n每次若最前面一个是损坏的,那么sum-1,若加上的一个损坏的就sum+1;
      进行取最小值操作
      输出最小灯数。

      银2题解

      #include<bits/stdc++.h>
      using namespace std;
      int n,k,b,ans;
      int a[100010]={};
      inline void init()
      {
          int x;
          cin>>n>>k>>b;
          for(int i=1;i<=b;i++)
            cin>>x,a[x]=1;
      }
      inline void work()
      {
          int sum=0;
          for(int i=1;i<=k;i++)
          {
              if (a[i]==1) sum++;
          }
          ans=sum;
          for(int i=k+1;i<=n;i++)
          {
            sum=sum+a[i]-a[i-k];
            if (sum<ans) ans=sum;
          }
      }
      int main()
      {
          memset(a,0,sizeof(a));
          init();
          work();
          cout<<ans;
          return 0;
      }
             
             
      • 银2反思

        其实当时我就想到了这一点,可我只想到了框住之后进行枚举,但这样O(n^2)肯定会TLE然后就没深入思考了,想着一些玄学操作,然后只拿了18分。

        银组T3

        银3题面

        这里写图片描述
        这里写图片描述
        这里写图片描述
        floodfill的变形,不断进行染色,处理边界,暴力搜索就过了。

        银3题解

        #include<bits/stdc++.h>
        using namespace std;
        int n,k,r,sum=0,sum1,ans=0;
        int a[110][110][4];//0下1右2上3左 
        int b[110][110];
        int f[110][110];
        int dx[4]={
                  
                  1,0,-1,0};
        int dy[4]={
                  
                  0,1,0,-1};
        inline void dfs(int x,int y)
        {
            if (x==0||y==0||x==n+1||y==n+1) return;
            b[x][y]=1;
            if (f[x][y]==1) sum1++;
            for(int i=0;i<=3;i++)
              if (b[x+dx[i]][y+dy[i]]==0&&a[x][y][i]==0) 
                dfs(x+dx[i],y+dy[i]);
        }
        inline void read()
        {
            int x1,y1,x2,y2,xx,yy;
            cin>>n>>k>>r;
            for(int i=1;i<=r;i++)
            {
              cin>>x1>>y1>>x2>>y2;
              if (x1==x2) 
                if (y1>y2) a[x1][y1][3]=1,a[x1][y2][1]=1;
                  else a[x1][y1][1]=1,a[x1][y2][3]=1;
              else if (x1>x2) a[x1][y1][2]=1,a[x2][y1][0]=1;
                     else a[x2][y1][2]=1,a[x1][y1][0]=1;
            }
            for(int i=1;i<=k;i++)
              cin>>xx>>yy,f[xx][yy]=1;
        }
        inline void work()
        {
            for(int i=1;i<=n;i++)
              for(int j=1;j<=n;j++)
                if (b[i][j]==0) 
                  {
                    sum1=0;
                    dfs(i,j);
                    ans+=(k-sum1)*sum1;
                  }
            cout<<ans/2;
        }
        int main()
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            memset(f,0,sizeof(f));
            read();
            work();
            return 0;
        }
                 
                 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星卯教育tony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值