本章将先对本次比赛三道比较简单的题进行整理--a,h,i;
A--造数
解析
对于三个操作。操作2可直接放大倍数使操作简化,所以我们可以直接判断n的奇偶性
逆向思维:
n为偶数,优先进行操作2除以2;
n为奇数,考虑操作1,2,即-1,-2,使n变为偶数;
重复上述操作直到n变为0。
#include<iostream>
#define int long long //注意n的范围
using namespace std;
int n,sum=0;
signed main()
{
cin>>n;
if(n==2)
{
cout<<1<<endl;
return 0;
}
while(n>=1)
{
if(n==2)
{
sum++;
break;
}
if(n%2==0)
{
n/=2;
sum++;
}
else
{
n-=1;
sum++;
}
}
cout<<sum<<endl;
return 0;
}
H--两难抉择
解析
要求操作后最大数组总和,我们就能想到直接对该数组中最大的数值进行操作。
对于两操作相比,只有当数值为1时,相加比相乘的结果大,我们只需判断最大数值是否为1即可
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
long long int a[n];
long long int ans=0;
int indx=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]>a[indx])
indx=i;
}
for(int i=0;i<n;i++)
{
if(i==indx)
{
if(a[i]!=1)a[i]*=n;
else a[i]+=n;
}
ans+=a[i];
}
cout<<ans<<endl;
}
I--除法移位
解析
要使结果为最大值,那第一个数越大越好,所以该题寻找最大值即可:
1.当所给步数充足时,数组最大值从后往前数的位置便是所需值。
2.数组a[0],位置为最大值,那么不需要移动
3.若所给步数不足让数组最大值移动,那么从后往前遍历,到所给步数为止,当前最大值的位置,便是所求值。
#include<iostream>
#include<stack>
using namespace std;
#define int long long
signed main()
{
int n,sop;
cin>>n>>sop;
int a[n],b;
int max1=0, indx=0,max2=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]>=max1)
{indx=i;max1=a[i];}
}//输入数组,找到最大值的下标
if(a[0]==max1) cout<<0<<endl;
else if((n-indx)<=sop) cout<<(n-indx)<<endl;//如果所给步数充足,直接输出
else
{
int i,j;
for( i=n-1,j=1;j<=sop;i--,j++)
{
if(max2<a[i])
{b=j;
max2=a[i];//找到在有限步数内,从后往前的当前最大值位置。
}
}
cout<<b<<endl;
}
return 0;
}