分糖果

:mod(取余运算 等于c++中的%)

1.

要解决这个问题,我们要在范围 [L, R] 内,选择一个糖果数量 k ,使得经过分配后的糖果数量尽量(即奖励)最大,分配的规则是:只要篮子里的糖果不少于 n 块,每个小朋友(包括自己)拿一块糖,剩余糖果即为奖励。 *备:每次需要拿完一整轮

问题分析:

奖励糖果的数量等于 k mod n(因为每次分配 n 块糖,直到剩余不足 n 块)。

我们需要在区间 [L, R] 中找到最大的 k mod n 的值。

要点:

可能存在最大的 k mod n 的值是 n - 1。如果区间 [L, R] 中可以存在多个 k ,则满足了 k mod n = n-1,那么这个值就是最大的奖励。

如果区间中没有这样的 k,那么最大的奖励是 R mod n,因为 R 是区间中最大的数,其模 n 的值也是最大的值。

接下来上解!!

错误代码:(90分,TLE)

#include<bits/stdc++.h>
using namespace std;
int n,l,r,x;
int main(){
    cin>>n>>l>>r;
    for(int i=l;i<=r;i++) x=max(x,i%n);
    cout<<x;
    return 0;
}

正确代码:

#include <iostream>
using namespace std;
int n,L,R,k;
int main(){
  cin>>n>>L>>R;
  if(R/n>L/n) k=n-1;
  else k=R%n;
  cout<<k;
  return 0;
}

极限压行代码(106 Bytes)

#include <iostream>
int n,L,R,k;int main(){std::cin>>n>>L>>R;if(R/n>L/n) k=n-1;else k=R%n;std::cout<<k;}

感谢观看

1 条评论

  • 1