3 条题解

  • 2
    @ 2022-9-23 18:21:48

    哈喽哈喽这里是桉。

    看到楼上的阿泠小朋友发了一篇题解于是我也想发。

    是不一样的做法。可参考。

    本题是csp-j 2021年第一题的真题哈。


    因为在最好的情况下 “你”可以拿到的糖果数是每个小朋友都得到的糖果数+额外的报酬。

    而额外的报酬如果在最好的情况下是小朋友数减一——因为如果多于或者等于小朋友数 这些糖果就会再次均分给所有的小朋友。

    所以说 我们只需要判断在大于l小于r的情况下有没有可能出现我们想要的最好情况(或者如果在大于r的情况下的最大报酬)


    另外 由于时间有可能会超时 所以我们可以采用一种奇奇怪怪的枚举方法——枚举倍数。

    我解释一下这个想法哈(目前我好像是没看见和我的做法差不多的 如果这个想法有原创的话 劳烦踹我原创作者 我标明 如果没有 那这个想法就应该是我原创的)

    就是因为在剩余糖果数大于小朋友数的情况下,每个小朋友都会得到一颗糖果。

    所以我们可以近似的看做是每轮分糖果的过程都是一次以n为乘数,轮数为乘次的乘法过程。

    所以我们就可以以枚举乘次来简化循环过程。在循环中只要判断 循环变量*n-1(或者(循环变量-1)** n+(n-1))是否大于l小于r就好了。

    ps:[由于语法原因这里多打一个乘号 就当是一个乘号看就好]


    废话不叨叨了。上代码——

    #include <bits/stdc++.h>
    using namespace std;
    long long n,l,r;
    int main()
    {
    	freopen("candy.in","r",stdin);
    	freopen("candy.out","w",stdout);
    	scanf("%lld %lld %lld",&n,&l,&r);
    	for(long long i=1;i<=r/n+1;i++)
    	{
    		if(i*n-1<=r && i*n-1>=l)
    		{
    			printf("%lld",n-1);
    			return 0;
    		}
    		else if((i*n)-1>r)
    		{
    			printf("%lld",r-((i-1)*n));
    			return 0;
    		}
    	}
    	return 0;
    }
    

    其实楼上阿泠的做法没怎么看懂。

    不过只要能AC就是好方法!!

    ——题解思路yc YeHangan.K。可借鉴不接受抄袭。

    信息

    ID
    489
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    (无)
    递交数
    50
    已通过
    15
    上传者