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 "); else printf("Yes ");
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)<<" ";
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 ",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 ",ans);