题3:倒水
【题目描述】
现给你 2 个水杯,容量分别为 a 和 b。最开始时,1 号水杯和 2 号水杯都是空的。
现你要按照如下规则操作倒水 k 次:
如果 1 号杯子水是满的,则将 1 号杯子中的水全部倒掉。
否则如果 2 号杯子是空的,则将 2 号杯子装满水。
否则,将 2 号杯子的水全部倒入 1 号杯子,直到 1 号杯子装满水或 2 号杯子水为空。
请问 k 次操作后,1 号杯子和 2 号杯子中的水量分别是多少?
【输入】
一行三个整数 a, b, k,分别表示 1 号杯⼦的容量,2 号杯子的容量和操作次数。
【输出】
一行两个整数,分别表示 1 号杯子和 2 号杯子中的水量。
【输入样例1】
3 5 2
【输出样例1】
3 2
第一次操作,给 2 号杯子装满水,水量分别为 0, 5;
第二次操作,将 2 号杯子的水全部倒入 1 号杯子,直到 1 号杯子装满水,水量分别为 3, 2。
【输入样例2】
2 6 3
【输出样例2】
0 4
【数据规模及约定】
对于20%的数据,k=1。
另有30%的数据,b是a的倍数。
对于100%的数据,1≤a,b≤105,1≤k≤105 。
题目解析:
根据题意,前两步操作非常简单,重点在第三步,2号杯的水倒入1号杯会出现两种情况:
- 2号杯现有水量大于等于1号杯时,1号杯水量=a,2号杯水量剩余水量为原有水量减去倒入1号杯的水量;
- 2号杯现有水量小于1号杯时,1号杯水量<a,为原有水量加上2号杯水量,2号杯水量为0。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,k,a1=0,b1=0;
cin>>a>>b>>k;
while(k--){
if(a1==a){
a1=0;
}else if(b1==0){
b1=b;
}else{
int t=a-a1; //1号杯目前可装入的水量
if(b1>=t){ //如果2号杯的水量足够装满1号杯
b1-=t; //2号杯减去装入1号杯的水量
a1+=t; //1号杯加上2号杯倒入的水量
}else{ //如果2号杯的水量不够装满1号杯
a1+=b1; //1号杯加上2号杯倒入的水量
b1=0; //2号杯清空
}
}
}
cout<<a1<<" "<<b1<<endl;
return 0;
}