A. Dense Array
分析:
如果找到相邻两个数不满足 m a x ( a [ i ] , a [ i + 1 ] ) ≤ 2 ∗ m i n ( a [ i ] , a [ i + 1 ] ) max(a[i],a[i+1])\le 2*min(a[i],a[i+1]) max(a[i],a[i+1])≤2∗min(a[i],a[i+1])
,那么就一直添加 m i n ( a [ i ] , a [ i + 1 ] ) min(a[i],a[i+1]) min(a[i],a[i+1])的两倍,直到 2 x ∗ m i n ( a [ i ] , a [ i + 1 ] ) ≥ m a x ( a [ i ] , a [ i + 1 ] ) 2^x*min(a[i],a[i+1])\ge max(a[i],a[i+1]) 2x∗min(a[i],a[i+1])≥max(a[i],a[i+1])
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=50;
int t,n,a[N];
int main(){
cin>>t;
while(t--){
int res=0;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n-1;i++){
int x=max(a[i],a[i+1]),y=2*min(a[i],a[i+1]);
if(x>y){
y/=2;
while(2*y<x){
res++;
y*=2;
}
}
}
cout<<res<<endl;
}
}
B. Balanced Remainders
分析: 最后相等的情况一定是 n 3 \frac{n}{3} 3n,先找到数值最高的数,如果他等于 n 3 \frac{n}{3} 3n,那么一定不用进行任何操作。
不等于一定大于。于是将他变为sum,把多余的数转换成他的下一个数 + 1 m o d 3 +1\mod3 +1mod3,最多进行两次,就可以得出结果。
代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,a,c[3];
int main(){
cin>>t;
while(t--){
cin>>n;
int res=0,m=0,flag=0,sum=n/3;
memset(c,0,sizeof c);
for(int i=0;i<n;i++){
cin>>a;
c[a%3]++;
if(c[a%3]>m){
m=c[a%3];
flag=a%3;
}
}
if(m==sum) cout<<0<<endl;
else{
res+=(m-sum);
c[(flag+1)%3]+=(m-sum);
if(c[(flag+1)%3]>sum) res+=(c[(flag+1)%3]-sum);
else if(c[(flag+1)%3]==sum) res+=0;
else res+=2*(sum-c[(flag+1)%3]);
cout<<res<<endl;
}
}
}
C. Sum of Cubes
分析: 暴力枚举,注意要加 ( long (\text {long} (long long ) \text{long}) long)
代码:
#include<bits/stdc++.h>
using namespace std;
int t;
long long int x;
unordered_set<long long int> s;
void init(){
for(int i=1;i<=10000;i++){
long long res=(long long )i*i*i;
s.insert(res);
}
}
int main(){
init();
cin>>t;
while(t--){
int flag=0;
cin>>x;
for(long long int i=1;(long long )i*i*i<x;i++){
if(s.count(x-(long long )i*i*i)){
flag=1;
break;
}
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}