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 周五集训队第三次比赛补题题解的主要内容,如果未能解决你的问题,请参考以下文章