codeforces#511.div2

A. Little C Loves 3 I

水题,分两种情况(1,1,n-2),(1,2,n-3)

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    if((n-2)%3==0)
      cout<<1<<" "<<2<<" "<<n-3<<endl;
    else
      cout<<1<<" "<<1<<" "<<n-2<<endl;
    return 0;
}

B. Cover Points

以最大的|x+y|为基准求x+y=b与坐标轴的交点

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    int maxn=-1;
    for(int i=0;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        maxn=max(maxn,x+y);
    }
    int pos=maxn;
    cout<<pos<<endl;
}

C. Enlarge GCD

有价值的一道题

题意:是去掉数列中的一些数,是整个数列的gcd增大(增大即可)

做法:首先求出整个数列的gcd(记为g)

此时数列可以表示为:k1*g,k2*g,k3*g,k4*g...(k1,k2,k3,k4..互质)

记录每个质因子在这个数列中出现的次数

找出出现次数最多的质因子的次数即可

再用个数减去次数

#include<bits/stdc++.h>
using namespace std;
int cnt;
#define maxn 15010
int a[15000001];
int p[15000001];
bool isprime[maxn];
int prime[maxn];
void init()
{
    cnt=0;
    memset(isprime,true,sizeof isprime);
    for(int i=2;i<=maxn;i++)
    {
        if(isprime[i])
        {
            prime[cnt++]=i;
            for(int j=2;i*j<=maxn;j++)
                isprime[i*j]=false;
        }
    }
}


int main()
{
    init();
    int n;
    scanf("%d",&n);
    int d=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        d=__gcd(d,a[i]);
    }
    for(int i=1;i<=n;i++)
    {
        a[i]/=d;
        for(int j=0;prime[j]*prime[j]<=a[i];j++)
        {
            if(a[i]%prime[j]==0)
            {
                p[prime[j]]++;
                while(a[i]%prime[j]==0)
                  a[i]/=prime[j];
            }
        }
        if(a[i]!=1)
            p[a[i]]++;
    }
    int ans=n;
    for(int i=2;i<=maxn;i++)
    {
        ans=min(ans,n-p[i]);
    }
    if(ans==n) printf("-1\n");
    else printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hzaukotete/article/details/83311367