今天研究了一下泊松分酒,想想今晚就要在火车上过夜了!!

蓝桥杯:


#include <iostream>
#include <cstdio>
using namespace std;
int i;
int probe(int a,int bv,int cv)
{
int b,c;
b=c=0;
int n=0;//计数器共分酒多少次 -1表示无法完成
while(!(a==i||b==i||c==i))
{
if(b==0)
{
if(a<bv)//当b瓶中为空时,a中的酒无法装满b瓶 说明无法完成分酒
{n=-1;break;}
else
{a-=bv;b=bv;}
}
else if(c==cv)
{a+=cv;c=0;}
else if(b+cv==i)
{
a-=(cv-c);c=cv;
}
else//当 b,c 都有酒,c没装满(含c==0);则把 b中的酒到往c瓶中
{
if(b<cv-c)
{
c+=b; b=0;
}
else
{
b-=(cv-c);
c=cv;
}
}
// cout<<a<<" "<<b<<" "<<c<<endl;
n++;
}
return n;
}
int main()
{
int a,bv,cv;
while(cin>>a>>bv>>cv)
{
i=a/2;
if(bv+cv<i||a&1)
{
cout<<"无法完成分酒:①b,c瓶之和体积太小②酒is odd"<<endl;
continue;
}
int m1=probe(a,bv,cv);
// cout<<endl;
int m2=probe(a,cv,bv);
// cout<<m1<<m2<<endl;
if(m1<0&&m2<0)
cout<<"无法完成分酒"<<endl;
else if(m1>0&&(m2<0||m1<m2))
cout<<"最少次数是"<<m1<<endl;
else //if(m2>0&&(m1<0||m2<m1))
cout<<"最少次数是"<<m2<<endl;
}
return 0;
}