• 2018/11/30 周五集训队第七次测试赛补题题解


    A - Coins CodeForces - 1061A

    上来先把题目看错。。。我以为要求所有满足的个数,没想到求满足的数字的最小的个数。这样直接套一个整除即可

    代码(算法四行)

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
      ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
      int n,s;
      cin>>n>>s;
      if(s%n==0)
      cout<<s/n;
      else
      cout<<s/n+1;
    }
    

    B - Views Matter CodeForces - 1061B

    自己把自己搞晕的一道题,实际上排个序会变得简单明了。具体的步骤凯哥已经说清楚了,这里我提供一下我自己的简单的实现凯哥思路的方法

    ①首先输入排序这个没有什么区别

    ②记录一下最高能到多高,这个意思是说如果升序排序的时候右边比左面高,那么高度加一如果高度相同,那么高度不变

    ③最后的剩余的个数就是用列数n+right(最大高度)-目前的高度,然后输出原来的总数-剩余的即可。这样代码量也不是很大

    ④注意用long long!!!

    代码

    #include <bits/stdc++.h>
    using namespace std;
    long long num[100005];
    int main()
    {
      ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
      long long n,m,sum=0,t=0,re=0;
      cin>>n>>m;
      for(int i=0;i<n;i++)
      cin>>num[i],re+=num[i];
      sort(num,num+n);
      for(int i=0;i<n;i++)
      if(num[i]>t)
      t++;
      sum=n+(num[n-1]-t);
      cout<<re-sum;
    }
    

    C - Vasya and Book CodeForces - 1082A

    这个玩意我上来就bfs,一看这个不是bfs模板题吗。然后无助的卡在第七个点tle。实际上这个东西因为边界的问题是可以找规律的。具体的解法林姐也说的挺清楚的了,我这里提供一下我的实现方法

    总共有三种情况

    ①直接能够到达

    ②通过1中转

    ③通过n中转

    其中②和③还得注意中转之前的那些步数也得算上。然后判断一下如果条件都不符合那么肯定是不行的。如果条件符合求个最小值即可

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
      ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
      int t;
      cin>>t;
      while(t--)
      {
        int n,x,y,d,ans1=0,ans2=0,ans3=0,ans=INT_MAX,f=0,ff=0,fff=0;
        cin>>n>>x>>y>>d;
        if(abs(x-y)%d==0)//第一种情况
        {
          f=1;
          ans1=abs(x-y)/d;
          ans=min(ans,ans1);
        }
        if((y-1)%d==0)//第二种情况
        {
          ff=1;
          if((x-1)%d==0)
          ans2+=(x-1)/d;
          else
          ans2+=(x-1)/d+1;
          ans2+=(y-1)/d;
          ans=min(ans,ans2);
        }
        if((n-y)%d==0)//第三种情况
        {
          fff=1;
          if((n-x)%d==0)
          ans3+=(n-x)/d;
          else
          ans3+=(n-x)/d+1;
          ans3+=(n-y)/d;
          ans=min(ans,ans3);
        }
        if(!f&&!ff&!fff)
        cout<<-1<<"
    ";
        else
        cout<<ans<<"
    ";
      }
    }
    

    D - Vova and Trophies CodeForces - 1082B

    又是这种我不擅长的模拟题。。。

    思路也是看了凯哥(完全复读)

    ①预处理一下,把两边都加上一个S

    ②扫一遍找到串中S的下标所在

    ③判断情况

    (1)如果里面只有预处理的两个那么肯定原串没有S,所以直接输出原串长度即可

    (2)如果里面比预处理多了一个S,那么肯定原串里面肯定是只有一个S的。显然这样直接输出原串-1

    (3)如果原串里面有多个S那么需要对每三个S进行一次判断。因为这个题的规律就是供给或者内销。供给就是这三个S卡的G是否可以从外面换进一个G或者内销就是把原来不相连的G相连

    (3).1这个地方还有一个判断的问题。如果我们直接判断位置的话那是不行的。因为可能串的后面都是S也说不定呢。。。

    (3).2这个地方凯哥用的方法是直接判断剩余的S与剩余的串的字符的个数进行比较。如果剩余的S少,那么说明可以供给,否则只能内销

    (3).2的代码

    if(vac.size()-3<n+1-(vac[i]-vac[i-2]))
    ans=max(ans,vac[i]-vac[i-2]-1);
    else
    ans=max(ans,vac[i]-vac[i-2]-2);
    

    完整代码

    #include <bits/stdc++.h>
    using namespace std;
    vector<int> vac;
    int main()
    {
      ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
      int n,ans=-1;
      cin>>n;
      string a;
      cin>>a;
      vac.push_back(0);
      for(int i=0;i<a.size();i++)
      if(a[i]=='S')
      vac.push_back(i+1);
      vac.push_back(n+1);
      if(vac.size()==2)
      cout<<n;
      else if(vac.size()==3)
      cout<<n-1;
      else
      {
        for(int i=2;i<vac.size();i++)
        {
          if(vac.size()-3<n+1-(vac[i]-vac[i-2]))
          ans=max(ans,vac[i]-vac[i-2]-1);
          else
          ans=max(ans,vac[i]-vac[i-2]-2);
        }
        cout<<ans;
      }
    }
    
  • 相关阅读:
    自制2048小游戏(附源码)
    PyQt5设计思路(长期更新,每写一篇新博客都会更新一次)
    Orthogonal table 实现理论
    Convex Hull 实现理论
    elasticsearch 命令操作
    Springboot
    2018/3/8错题解析
    初始MyBatis
    如何做好微信订阅号
    在路上,三线城市互联网创业记录
  • 原文地址:https://www.cnblogs.com/baccano-acmer/p/10049025.html
Copyright © 2020-2023  润新知