2018/11/2 周五集训队第三次比赛补题题解

Posted baccano-acmer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018/11/2 周五集训队第三次比赛补题题解相关的知识,希望对你有一定的参考价值。

这次题目都比较亲民啊。。。没有什么算法题倒是

A.珠心算测试

注意是数量的个数,不是等式的个数。。。而且我上来两发RE,也是很迷,直接用了map

代码

#include <bits/stdc++.h>
using namespace std;
map<int,int> num;
map<int,int> bk;
map<int,int> ans;
map<int,map<int,int> > vis;
int main()
{
  int n,sum=0;
  cin>>n;
  for(int i=0;i<n;i++)
  cin>>num[i],bk[num[i]]=1;
  for(int i=0;i<n;i++)
  for(int j=0;j<n;j++)
  {
    if(i!=j)
    {
      if(bk[num[i]+num[j]]&&!vis[num[i]][num[j]]&&!vis[num[j]][num[i]])
      {
        //cout<<num[i]+num[j]<<endl;
      vis[num[i]][num[j]]=vis[num[j]][num[i]]=1;
      if(!ans[num[i]+num[j]])
      {
        ans[num[i]+num[j]]=1;
        //cout<<num[i]+num[j]<<endl;
        sum++;
      }
    }
    }
  }
  cout<<sum;
}

B 比例简化

这题明明这么简单。。。为啥大佬都不做啊- =,很迷。实际上两个for进行枚举就行啊,暴力完全没有问题

代码

#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
  return b==0?a:gcd(b,a%b);
}
int main()
{
  double a,b,l,a1,a2,min=INT_MAX;
  cin>>a>>b>>l;
  double c=a/b;
  for(double i=1;i<=l;i++)
  for(double j=1;j<=l;j++)
  if(gcd(i,j)==1)
  {
    if(i/j>=c)
    {
      double d=i/j-c;
      if(d<min)
      {
        min=d;
        a1=i,a2=j;
      }
    }
  }
  cout<<a1<<" "<<a2;
}

C.螺旋矩阵

紫书上的原题,唯一不同的是。。。这次开不出数组来,那么我们只好用数组下标模拟一下

代码

#include <bits/stdc++.h>
using namespace std;
int bx[300005];
int by[300005];
int main()
{
    int n,x,y,ans;
    cin>>n>>x>>y;
    int x1=1,y1=1,cnt=1;
    bx[1]=1;
    if(x==x1&&y==y1)
    return cout<<1,0;
    while(cnt<n*n)
    {
      while(y1+1<=n&&!by[y1+1])
      {
        ans=++cnt;
        y1++;
        //cout<<ans<<endl;
        if(x==x1&&y==y1)
        return cout<<ans,0;
        //cout<<mp[x1][y1]<<" "<<cnt<<endl;
      }
      //cout<<x1<<" "<<y1<<endl;
      by[y1]=1;
      while(x1+1<=n&&!bx[x1+1])
      {
        ans=++cnt;
        x1++;
        if(x==x1&&y==y1)
        return cout<<ans,0;
      }
      //cout<<x1<<" "<<y1<<endl;
      bx[x1]=1;
      while(y1-1>=1&&!by[y1-1])
      {
        ans=++cnt;
        y1--;
        if(x==x1&&y==y1)
        return cout<<ans,0;
      }
      //cout<<x1<<" "<<y1<<endl;
      by[y1]=1;
      while(x1-1>=1&&!bx[x1-1])
      {
        ans=++cnt;
        x1--;
        if(x==x1&&y==y1)
        return cout<<ans,0;
      }
      //cout<<x1<<" "<<y1<<endl;
      bx[x1]=1;
    }
    //cout<<mp[x][y];
}

D.子矩阵

待研究

E.计数问题

还是紫书上的原题,直接用stringstream暴力破解,然后800多ms罚时。。。不过写的快

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,x,sum=0;
    cin>>n>>x;
    for(int i=1;i<=n;i++)
    {
      stringstream s;
      s<<i;
      string ans;
      s>>ans;
      for(int i=0;i<ans.size();i++)
      if(ans[i]==char(x+‘0‘))
      sum++;
    }
    cout<<sum;
}

F.表达式求值

待研究

以上是关于2018/11/2 周五集训队第三次比赛补题题解的主要内容,如果未能解决你的问题,请参考以下文章

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

集训队寒假集训第二场补题题解

正睿2018暑假集训 比赛题选做

集训队8月2日(BFS)

acm新生集训第一周比赛题解

2017杭电ACM集训队单人排位赛 - 2 题解