1. 程式人生 > 實用技巧 >Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)

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);