3 条题解
-
2
推一下楼上的代码
//先把万能头敲好(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
哈喽哈喽这里是桉。
看到楼上的阿泠小朋友发了一篇题解于是我也想发。是不一样的做法。可参考。
本题是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
- 上传者