Codeforces Round #725 (Div. 3) ABCDEFG题解
Posted quinn18
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #725 (Div. 3) ABCDEFG题解相关的知识,希望对你有一定的参考价值。
文章目录
A - Stone Game
题意:只能从数列两边删去元素 问删掉最大值和最小值最小要几步
假如最小值在最大值前面
要么从左边删到最小值
这样之后
要么继续删到最大值
要么从右边删到最大值2
要么从右边删最大值
这样之后
要么继续向左3
要么从左删到最小值4
其中2和4是一样的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int aa[200005], bb[200005];
int main() {
int t;
cin>>t;
while(t--) {
int n;
cin>>n;
for(int i=1; i<=n; i++) {
cin>>aa[i];
bb[aa[i]]=i;
}
sort(aa+1, aa+1+n);
int x=bb[aa[1]];
int y=bb[aa[n]];
int ans=0;
if(x<y) {
ans=x+y-x;//取左边+中间
ans=min(ans, x+n-y+1);//取左边+右边
ans=min(ans, n-y+1+y-x);//取中间+右边
}else {
ans=y+x-y;
ans=min(ans, y+n-x+1);
ans=min(ans, n-x+1+x-y);
}
cout<<ans<<endl;
}
return 0;
}
B - Friends and Candies
题意:给你给数组 你可以选 k ( 所 求 ) k(所求) k(所求) 分配到其他位置 使数列所有都相等 求最小个数 k k k
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a, b, k, aa[200005], bb[200005];
int main() {
int t;
cin>>t;
while(t--) {
int n;
cin>>n;
int l=0, r=1e9;
for(int i=1; i<=n; i++) {
cin>>aa[i];
l+=aa[i];
}
if(l%n!=0) cout<<-1<<endl;
else {
sort(aa+1, aa+1+n, greater<int>());
int sum=0;
int ans=l/n;
int q=0;
for(int i=1; i<=n; i++) {
if(aa[i]<=ans) continue;//离谱 这里只要把大于l/n的取过来就好了 判断了好久
q++;
}
cout<<q<<endl;
}
}
return 0;
}
C - Number of Pairs
c i n > > n > > l > > r cin>>n>>l>>r cin>>n>>l>>r和给你一个数列,找使 1 < = i < j < = n 1<=i<j<=n 1<=i<j<=n, l < = a i + a j < = r l<=ai+aj<=r l<=ai+aj<=r,求这样的 p a i r pair pair的个数
上过一次位置的当就不会再上啦
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll l, r, a[200005];
int main() {
int t;
cin>>t;
while(t--) {
int n;
cin>>n>>l>>r;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
ll ans=0;//没开ll 呜呜
sort(a+1, a+1+n);//和位置没关系
for(int i=1; i<=n; i++) {//on查找
if(a[i]<=l) {//假如不判断位置的话就要讨论要不要减一加一巴拉巴拉 了
int zuo=lower_bound(a+i+1, a+1+n, l-a[i])-a;//在自己之后找避免找到自己
int you=upper_bound(a+i+1, a+1+n, r-a[i])-a-1;
ans+=you-zuo+1;
}else if(a[i]<=r) {
int you=upper_bound(a+i+1, a+1+n, r-a[i])-a-1;
ans+=you-i;
}
}
cout<<ans<<endl;
}
return 0;
}
D - Another Problem About Dividing Numbers
题意:给你两数 a , b a, b a,b你有把 a 或 b a 或 b a或b除 c c c( c c c能被整除)的操作,问你经过 k k k次操作能不能使 a = = b a==b a==b
然后我们就想到质因数啦
#include<bits/stdc++.h>
using namespace std;
const int N = 6e6 + 9;
int prime[N], vis[N], tot;
int is_prime[N];
void GetPrime(int N) {
vis[1]=1;
tot=0;
for(int i=2; i<=N; i++) {
if(!vis[i]) prime[++tot]=i, is_prime[i]=1;
for(int j=1; j<=tot && i*prime[j]<=N; j++){
vis[i*prime[j]]=1;
if (!(i % prime[j])) break;
}
}
}
int main() {
int t;
cin>>t;
GetPrime(100000);
while(t--) {
int a, b, k;
cin>>a>>b>>k;
int ans=2;
if(a==1&&b==1) ans=0;
else if(a==1) ans=1;//
else if(b==1) ans=1;//
else if((b%a==0&&a!=b)||(a%b==0&&a!=b)) ans=1;//判断左边界
int sum=0; int cnt=1;
while(a>1) {
while(a%prime[cnt]==0) {
a/=prime[cnt];
sum++;
}
cnt++;
if (cnt==5000) {
sum++; break;
}
}
cnt=1;
while(b>1) {
while (b%prime[cnt]==0) {
b/=prime[cnt];
sum++;
}
cnt++;
if(cnt==5000) {
sum++;
break;
}
}
if (k>=ans&&k<=sum) cout <<"YES"<< endl;
else cout<<"NO"<<endl;
}
return 0;
}
F - Interesting Function
题意:给你 l , r l,r l,r问把 l l l变成 r r r变了多少位
#include<bits/stdc++.h>
using namespace std;
const int N= 100;
typedef long long ll;
int main() {
int t;
cin>>t;
while(t--) {
int l, r;
cin>>l>>r;
int cnt=0;
int lll=l, rr=r;
while(lll) {
++cnt;
lll/=10;
}
int cnt1=0;
while(rr){
++cnt1;
rr/=10;
}
ll ans=0; ll ans2=0;
for(int i=1; i<=cnt; i++) {
ans+=l/(pow(10, i-1));
}
for(int i=1; i<=cnt1;i++) {
ans2+=r/pow(10, i-1);
}
cout<<ans2-ans<<endl;
}
return 0;
}
总结
以上是关于Codeforces Round #725 (Div. 3) ABCDEFG题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #725 (Div. 3)Codeforces-1538
Codeforces Round #725 (Div. 3)Codeforces-1538
Codeforces Round #725 (Div. 3)Codeforces-1538
Codeforces Round #725 (Div. 3)部分题解