ACM模版

描述


题解

这个题就是一个贪心,但是 AC 率却好低,做了这道题后我发现了原因,因为到现在我还感觉这个题数据有误……

首先这个题我们可以先根据 L 来进行两次操作,分别倒入 L/2 L/2+1 体积,然后轮流往杯子中倒入 2 ,直到最后剩余的不超过 1 。感觉思路很清晰,不难,但是需要考虑最后这个剩余的 1 的情况和特判一些边界。

我经过再三反复的尝试,发现,可以根据 L 的奇偶性和 RL 的奇偶性来判段,只有当两者都为偶数时,才会出现多计算一次的情况,于是我酱紫写了,我的程序运行 5 8 ans=3 ,我感觉这也是正确的答案,没有毛病,但是结果却 WA 了,找了别人 AC 的代码,发现人家的代码运行结果是 2 ,这让我很诧异,这明显不符合贪心思路啊,我又试了半天,还是不行,感觉自己除了数据问题这个理由外,实在是想不出更好的原因了。

如果我的想法有什么遗漏,烦请大神们告知,为什么 5 8 这样的结果为 2 <script type="math/tex" id="MathJax-Element-1002">2</script>???

心塞啊……怪不得这么简单的一个题 AC 率如此低。

代码

// 这是 AC 代码,但是并不是我心目中正确的代码……
#include <iostream>

using namespace std;

typedef long long ll;

ll L, R;

ll solve(ll l, ll r)
{
    if (r <= 1)
    {
        return 0;
    }
    if (r <= 2)
    {
        return 1;
    }
    if (l == r || l == r - 1)
    {
        return 2;
    }
    if (l < 1)
    {
        l = 1;
    }
    return (r - l) / 2 + 1;
}

int main()
{
    while (~scanf("%lld%lld", &L, &R))
    {
        printf("%lld\n", solve(L, R));
    }

    return 0;
}