1. 程式人生 > >2018/11/2 週五集訓隊第三次比賽補題題解

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

待研究