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<<"\n";
    else
    cout<<ans<<"\n";
  }
}

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;
  }
}
posted @ 2018-12-01 12:34  baccano!  阅读(239)  评论(0编辑  收藏  举报