Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)

A. Array Rearrangment

题意:给定a序列和b序列,问ai+bix是否都成立

一个从小到大排,一个从大到小排,然后加一加。。。

        int flag=0;
        scanf("%d%d",&n,&x);
        for(int i=1;i<=n;++i)    scanf("%d",&a[i]);
        for(int i=1;i<=n;++i)    scanf("%d",&b[i]);
        sort(a+1,a+1+n);
        sort(b+1,b+1+n,cmp);
        for(int i=1;i<=n;++i){
            int c=a[i]+b[i];
            if(c>x){
                flag=1;
            }
        }
        if(flag)    printf("No\n");
        else        printf("Yes\n");

B. Elimination

题意:给a,b,c,d。

a是第一场比赛第100名的得分,b是第一场比赛前100名中,最少的那个人在第二场比赛的得分
c是第二场比赛第100名的得分,d是第二场比赛前100名中,最少的那个人在第一场比赛的得分

既然得分不会重,那么很明显,,,

        scanf("%d%d%d%d",&a,&b,&c,&d);
        cout<<max(a+b,c+d)<<"\n";

C. Division

题意:给定p、q,找到一个最大的x。使得p能被x整除,同时x不能被q整除。

当p不能被q整除,那就是p。

否则的话,此时q就是p的一个约数。

对q进行分解质因数。

令x=p,使之最大化,然后枚举q的素因数,x/=该素因数。

现在有两种可能,一种是x中该素因数的个数比q中少了,那么x已经不能被q整除了。

另一种是,x中该素因数个数还有很多,那么x还能被q整除,继续x/=该素因数。

然后对每个素因数都这么干一次,每次初始化x。

至于为什么最优?

很明显,只有x中某一个的素因数个数比q少,x不能被q整除才能成立。此时多除一个x的别的素因数,只会让答案更小。

        scanf("%lld%lld",&p,&q);
        if(p%q!=0){
            printf("%lld\n",p);
            continue;
        }
        ll tmp=q,ans=-1;
        vector<ll> v;
        for(ll i=2;i*i<=tmp;++i){
            while(tmp%i==0){
                v.push_back(i);
                tmp/=i;
            }
        }
        if(tmp>1)    v.push_back(tmp);
        
        for(int i=0;i<v.size();++i){
            tmp=p;
            while(tmp%q==0){
                tmp/=v[i];
            }
            ans=max(ans,tmp);
        }
        printf("%lld\n",ans);                

 

posted @ 2020-11-04 23:31  PdrEam  阅读(123)  评论(0编辑  收藏  举报