2016ACM/ICPC Qingdao Online-1004 Tea

本文探讨了一道关于倒茶次数的算法题目,旨在求解在一壶茶容量范围[L,R]内,将茶倒入两个杯子中并确保茶壶剩余茶量不超过1且两杯茶量差距不超过1所需的最少倒茶次数。通过分析不同初始容量值的特点,给出了一种高效算法解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:一壶茶的容量在[L,R]之间,依次倒入两个茶杯中,需要保证最后茶壶中的茶<=1,两个茶杯中的茶相差<=1,问至少需要倒几次?(0<=L<=R<=10^16)

题解:为了保证倒较少的次数,每次倒的要尽可能多,又要让[L,R]中的每个数满足。当L较大时,

若L为奇数,先给第一个人倒,再给第二个人倒+1,接下来第一个人最多只能倒2,第二个人也只能倒2,……,依次下去直到倒完;

若L为偶数,先给第一个人倒+0.5,再给第二个人到+1.5,接下来第一个人最多只能倒2,第二个人也只能倒2,……,依次下去直到倒完。

L=0的情况和R<=2的情况手算一下,其余的情况当L+2+1>=R时,答案为2;否则答案为

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

typedef long long LL;

const int M=1e9+7;
const int N=1e5+10;
int main()
{
    LL L,R;
    while (cin>>L>>R){
        if (L<=1 && R<=1)cout<<0<<endl;
        else if (L==0){
            if (R==2)cout<<1<<endl;
            else cout<<2+(R-3)/2<<endl;
        }
        else if (L==1 && R==2)cout<<1<<endl;
        else if (L==2 && R==2)cout<<1<<endl;
        else if (L+2+1>=R)cout<<2<<endl;
        else cout<<2+(R-(L+2))/2<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值