题解:B4519 [科大国创杯小学组 2026] 贪吃巧克力

· · 题解

模拟题。

每天从左右两边开始往中间找契合度等于当天幸运值的格子。

没找到就把巧克力吃完,找到了就看是从左边找到的还是从右边找到的。

如果从左边找到,输出 L 和需要吃掉的格数,并移动左边界至找到的格子的右边一格。

如果从右边找到,输出 R 和需要吃掉的格数,并移动右边界至找到的格子的左边一格。

这样不断模拟,时间复杂度为 O(n)

具体过程还是见代码吧。

#include<bits/stdc++.h>
using namespace std;
long long c,n,m,p,x,l,r,a[1000010];
int w(int now)
{
    return l+((now-l+p)%(r-l+1));
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); 
    cin>>c>>n>>m;
    l=1;
    r=n; 
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=m;i++)
    {
        cin>>p>>x;
        int z=l,y=r,f=-1;
        for(;z<=y;z++,y--)
        {
            if(a[z]*a[w(z)]==x)
            {
                f=1;
                break;
            }
            if(a[y]*a[w(y)]==x)
            {
                f=0;
                break;
            }
        }
        //每天从左右两边开始往中间找契合度等于当天幸运值的格子。
        if(z>y)
        {
            cout<<"F\n";
            l=z;
            r=y;
            //没找到 
        }
        else if(f==1)
        {
            cout<<"L "<<z-l+1<<'\n';
            l=z+1;
            //从左边找到 
        }
        else
        {
            cout<<"R "<<r-y+1<<'\n';
            r=y-1;
            //从右边找到 
        }
    }
    return 0;
}