3 条题解

  • 5
    @ 2022-8-23 11:49:03
    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	freopen("candy.in","r",stdin);
    	freopen("candy.out","w",stdout);
    	int n,l,r,t;
    	cin>>n>>l>>r;
    	t=l%n;
    	if(t+(r-l)>=n-1){
    		cout<<n-1;
    	}
    	else{
    		cout<<r%n;
    	}
    	return 0;
    } 
    
    • @ 2022-8-23 11:50:01

      👀️ 👀️ 👀️ !!!

  • 2
    @ 2023-3-18 11:41:25

    推一下楼上的代码

    //先把万能头敲好(bushi) 
    
    #include <bits/stdc++.h>
    using namespace std;
    
    //题目让输入的变量设好
    long long n,L,R; 
    //注意范围10的9次幂比较大long long 保险
    
    int main(){
    	//比赛时加上freopen 
    	freopen("candy.in","r",stdin);
    	freopen("candy.out","w",stdout); 
    
    	//scanf,printf快一点(也没快到哪里去)
    	scanf("%lld %lld %lld",&n,&L,&R);
    
    	/*
    	设你得到的糖果奖励为win 
    	wim<n且为整数
    	win的最大值为n-1即k%n=n-1
    	k+1 能被n整除
    	若此时L<=k<=R则win=n-1
    	这是第一种情况 
    	
    	如果L到R不包含k+1能被n整除的情况
    	比如当n=10,L=14,R=18时
    	k+1尽量接近n的倍数,此时k应当是L到R的最大值也就是R 
    	
    	我们只需要判断题目数据是以上那种情况
    	这题就完全不需要循环 
    	*/ 
    
    	if( L%n+R-L < n-1 ){
    		printf("%lld",R%n);
    	}
    	//当R到L中没有k+1能被n整除的情况时输出R%n
    
    	else{
    		printf("%lld",n-1);
    	} 
    	return 0;
    }
    

    这题很好骗分 直接输出n-1就行可以尝试一下

  • 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。可借鉴不接受抄袭。

    • 1

    信息

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