Codeforces Global Round 24(B,C)
这一次vp真是大失所望,我只写了A ,第二题最后发现离那个答案很近了,但就是没想到,看来还是功力不到家呀
这道题的大意是有一个数组,我们可以选择任意两个数x,y,但是x-y>0且x-y不在这个数组里的,是一个新的数据,问我们最大可以使得这一个数组的大小为多少
我一开始是先排序,然后判断a[i]和a[1]是否能整除,因为我想到只有可以整除的时候这个数量就是a[n]/a[1],否则就是a[n],后来我想到6,9虽然能过相互整除,但是最后的答案一定不是9,而是3,后来我看到答案是所有的数的gcd,答案就是最大的那个一个除以最后求出的gcd,恍然大悟
#include <iostream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn=2e5+10;
int n,t;
void solve()
{
int mx=0;
int ans=0;
cin>>n;
for (int i=1;i<=n;i++)
{
int tmp;
cin>>tmp;
if (i==1)
{
ans=tmp;
}
else
{
ans=__gcd(ans,tmp);
}
mx=max(mx,tmp);
}
cout<<mx/ans<<'\n';
return ;
}
int main ()
{
cin>>t;
while (t--)
{
solve();
}
system ("pause");
return 0;
}
这一道题就是连线,但是不可以存在u,v,w,a[u]<=a[v]<=a[w]这样的三个点连接在一起,可以理解为中间的那一个可以是最大的,也可以是最小的,但就是不能是最中间的那一个(对于三个点,两个点的时候可以随便)
我看了大佬的代码,说一下我对代码的理解
有两种情况,
1,ans=n/2,所有的点两两连线
2,如果a[i]!=a[i-1])
ans=(i-1)*(n-i+1)把n个点分开,前i-1作为一个部分,i到n作为一个部分,这两个部分形成二部图
每次找最大的ans
#include <iostream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn=2e5+10;
#define int long long
int n,t;
int a[maxn];
void solve()
{
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
int ans=n/2;
for(int i=2;i<=n;i++)
{
if(a[i]!=a[i-1])
{
ans=max(ans,(i-1)*(n-i+1));
}
}
cout<<ans<<'\n';
return ;
}
signed main ()
{
cin>>t;
while (t--)
{
solve();
}
system ("pause");
return 0;
}
标签:24,tmp,int,Global,Codeforces,solve,ans,include
From: https://www.cnblogs.com/righting/p/17000565.html