题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5881
题意: 现在有一壶水,体积在[L, R]范围内,现有两个空杯子,现想要把这壶水倒入这两个杯子中去,使得壶中剩余的水的体积<=1,并且两个杯子的体积差<=1;求最少需要到多少次;
题解:当R<=1的时候,很明显是不需要倒的,符合条件;当R==2的时候,只需倒一次即可; 当R>2时,我们可以先往第一个杯子中到 L/2,第二个杯子到 (L+1)/2,这样最大化的情况下就是还剩余R-L-1,然后把这些每次倒入体积2(这样才能保证两个杯子的体积差<=1)的进入每个杯子,直到体积剩下<=1即可; 整理一下结果就是max(2, (R-max(1, L)/2)+1);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> #include<queue> #include<set> using namespace std; #define met(a, b) memset(a, b, sizeof(a)) #define N 100005 #define INF 0x3f3f3f3f typedef long long LL; int main() { LL L, R; while(scanf("%I64d %I64d", &L, &R) != EOF) { if(R<=1) printf("0 "); else if(R<=2) printf("1 "); else { printf("%I64d ", max( (R - max(L, 1ll))/2+1ll, 2ll)); } } return 0; }