本题目就是求一个把一个数组某些元素同时加一最后变成一个数字全部一样的数组,求最少的操作次数。也就是最小值到最大值的距离。
#include<bits/stdc++.h>
using namespace std;
int a[100001],n;
int main()
{
int t;cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int Max=0,Min=1e9;
for(int i=0;i<n;i++)
{
Max=max(Max,a[i]);
Min=min(Min,a[i]);
}
cout<<(Max-Min)<<endl;
}
}
题目就是问把abc三个数其中一个乘上一个数能否将这三个数变成等差数列
计算过程如下
得到三种情况之后和abc之间关系后代码就很好写了
#include<bits/stdc++.h>
using namespace std;
int a,b,c,t;
int main()
{
cin>>t;
while(t--)
{
int f=0;
cin>>a>>b>>c;
if(b-a==c-b) f=1;
else{
int x=(b-(c-b)),y=c-(c-a)/2,z=b+(b-a);//三种情况下的关系
if(x%a==0&&x>0){//a乘一个数
a*=x/a;
if(b-a==c-b) f=1;
}
else if(y%b==0&&y>0)//b乘一个数
{
b*=y/b;
if(b-a==c-b) f=1;
}
else if(z%c==0&&z>0)//c乘一个数
{
c*=z/c;
if(b-a==c-b) f=1;
}
}
if(f) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
这题就是说给一组长为n的数能不能通过数以2并且向下取整的操作让里面的数变成从1-n。
我们只要弄一个标记数组,把找到了的数做上标记大于n的数重复除2的过程就ok。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;
while(t--){
int n;cin>>n;
int a[n],b[n+1];
memset(b,0,sizeof(b));
for(int i=0;i<n;i++) cin>>a[i];
int f=1;
for(int i=0;i<n;i++){
int x=a[i];
while(x>n||b[x]) x/=2;
if(x>0) b[x]=1;
else f=0;
}
if(f==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}