关键是如何去重
本来是想把分数最为一个有序二元组放入set中,重载小于运算符,set自带去重,但是速度太慢超时了。
超时代码如下:
include
using namespace std;
int T,n;
int a[1010];
struct Point
{
int xx,yy;
bool operator<(const Point& bb) const
{
if(xx!=bb.xx) return xx S;
int gcd(int aa,int bb)
{
if(aa\=bb) return 0;
return 1;
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>T;
for(int step=0;step>n;
S.clear();
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(ok(a[i],a[j])) S.insert((Point){a[i],a[j]});
if(ok(a[j],a[i])) S.insert((Point){a[j],a[i]});
}
printf(“case #%d:\n%d\n”,step,S.size());
}
return 0;
}
后来发现,只要先把n个数排序,去重,这n个数没有重复了,产生的分数也不会重复
而且因为都是最简分数,不会出现1/2=2/4重复的情况
代码如下:
include
using namespace std;
int T,n;
vector a,b;
int gcd(int aa,int bb)
{
if(aa=bb) return 0;
return 1;
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>T;
for(int step=0;step>n;
int ans=0;
a.clear();
for(int i=1;i<=n;i++)
{
int xx;
cin>>xx;
a.push_back(xx);
}
sort(a.begin(),a.end());
b.clear();
unique_copy(a.begin(),a.end(),back_inserter(b));
for(int i=0;i<b.size();i++)
for(int j=i+1;j<b.size();j++)
{
if(ok(b[i],b[j])) ++ans;
if(ok(b[j],b[i])) ++ans;
}
printf(“case #%d:\n%d\n”,step,ans);
}
return 0;
}
你说得很有道理
(点赞)