查找不等式为真的次数时出现问题

Problem finding the number of times the inequality is true

本文关键字:问题 不等式 真的 查找      更新时间:2023-10-16

我有一个数学问题。该程序由 5 个输入变量(p,q,r,L,R(和 1 个输出组成。

问题:一个人有N个巧克力。他希望分享给3个人。第一个人会得到 N/p 巧克力(如果分数是 5.00,他给这个人 5,但如果分数是 5.01 左右(你必须 ceil(L/p( 到更高的数字(。他给人#2,给人#3的L/r巧克力。如果数字N从[L,R]变化,他有多少次可以成功分享巧克力,这样它就不会超过他的库存。必须满足的条件是

(ceil(L/p( + ceil(L/q( + ceil(L/r(( <= N

关键是要尽快计算它。我试图找到满足条件的第一个成功时间,然后将其乘以它包含在 R 中的时间,但我找不到在 ~0.5 秒内做到这一点的方法。

一个例子(正确的一个(: 输入: 2 3 7 9 14 输出:2

工作版本(但太懒了(是: 工作版本是:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);

int p,q,r;
//unsigned long long int L,R;
unsigned long long int L,R;
int i=0;
cin >> p;
cin >> q;
cin >> r;
cin >> L;
cin >> R;
for (; L<=R; L++) {
if(( ceil((long double)L/p)+ ceil((long double)L/q ) + ceil((long double)L/r) ) <= L) {
i++;
}
}
cout << i;
}

输入限制为: 1 <= a,b,c <= 10 和 1 <= X <= Y <= 10^18

在我看来,你应该利用这样一个事实,即递增L,你也递增除法的余数L/pL/qL/r

所以我想你只能计算三个除法,避免循环内的除法。

我的意思是。。。而不是

for (; L<=R; L++) {
if(( ceil((long double)L/p)+ ceil((long double)L/q ) + ceil((long double)L/r) ) <= L) {
i++;
}
}

你可以写(注意:代码只用 2、3、7、9、14 测试(

auto dp = std::lldiv(L, p);
auto dq = std::lldiv(L, q);
auto dr = std::lldiv(L, r);
auto rp = dp.rem;
auto rq = dq.rem;
auto rr = dr.rem;
auto sum =   dp.quot + (rp ? 1ll : 0ll)
+ dq.quot + (rq ? 1ll : 0ll)
+ dr.quot + (rr ? 1ll : 0ll);
while ( L <= R )
{
if ( sum <= L++ )
++i ;
if ( 1ll == ++rp )
++sum;
else if ( p == rp )
rp = 0ll;
if ( 1ll == ++rq )
++sum;
else if ( q == rq )
rq = 0ll;
if ( 1ll == ++rr )
++sum;
else if ( r == rr )
rr = 0ll;
}

而且,也许,您可以简化一点if-else if部分。

题外话:我对所有变量都使用了long longpqrLRi