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.表达式求值

又是奇怪的模拟题,又是熟悉的跪。。。实际上这个模拟题还不错,他的思想还是挺好的。

代码(注释在代码中)

//思路就是用+分开*每个加号都能分隔开前面乘法的总和
//因为数量都是在int范围之内,且最后取四位不含前导0,就是%10000,应用余数法则
#include <bits/stdc++.h>
using namespace std;
int main()
{
  int a1,a2,ans=0;
  char c;
  cin>>a1;//先输入一个数,进行第一部分的检索
  a1%=10000;
  while(cin>>c)
  {
    cin>>a2;
    a2%=10000;
    if(c=='+')
    {
      ans+=a1;//把前面的a1的乘积加起来
      ans%=10000;
      a1=a2;//更新a1
    }
    if(c=='*')
    {
      a1*=a2;//一直连乘
      a1%=10000;
    }
  }
  ans+=a1;//把最后一部分加上
  cout<<ans%10000<<endl;
}
posted @ 2018-11-02 23:23  baccano!  阅读(146)  评论(0编辑  收藏  举报