Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)
阿新 • • 發佈:2020-11-05
A. Array Rearrangment
題意:給定a序列和b序列,問ai+bi≤x是否都成立
一個從小到大排,一個從大到小排,然後加一加。。。
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);