题解:P12642 [KOI 2024 Round 1] 加倍
本题我第一眼看着觉得很简单,这不就是模拟吗,每次给不满足
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[250010];
signed main()
{
int n;
scanf("%lld",&n);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
int ret=0;
for (int i=2;i<=n;i++)
{
//模拟
while (a[i]<a[i-1])
{
a[i]*=2;
ret++;
}
}
printf("%lld",ret);
return 0;
}
结果交上去一看
AC Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[250010];
int cheng[250010];
int k[110];
signed main()
{
int n;
scanf("%lld",&n);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
int ret=0;
k[1]=2;
k[0]=1;
//预处理2的幂次
for (int i=2;i<=50;i++)
{
k[i]=k[i-1]*2;
}
for (int i=2;i<=n;i++)
{
int l=0,r=1e9,best=-1;
//二分
while (l<=r)
{
int mid=(l+r)/2;
//相差太大就退出
if (mid-cheng[i-1]>=40)
{
r=mid-1;
continue;
}
if (cheng[i-1]-mid>=40)
{
l=mid+1;
continue;
}
int now,last;
//爆longlong问题处理
if (cheng[i-1]>=mid)
{
now=a[i];
last=a[i-1]*k[(cheng[i-1]-mid)];
}
else
{
now=a[i]*k[(mid-cheng[i-1])];
last=a[i-1];
}
if (now>=last)
{
best=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
ret+=best;
cheng[i]=best;
}
printf("%lld",ret);
return 0;
}