题目描述

牛牛因为数学太差被老师赶出教室了,虽然老师侵犯了牛牛的公平教育权,但是牛牛在教室外的小卖部大彻大悟,提升了自己的数学水平。 故事是这样的:学校里的小卖部里有一个活动:只要有三个饮料瓶就可以换一瓶新的饮料。现在牛牛从路边捡到了10个饮料瓶,于是牛牛开始兑换饮料。他的兑换操作如下:先用9个饮料瓶换 3瓶饮料,喝完。然后手里有 4个饮料瓶,再拿出3个换1瓶饮料,这时手里有2个饮料瓶。牛牛再问老板借1瓶料,喝完之后又多了1个饮料瓶,然后拿 3个饮料瓶换1瓶饮料还给老板。 有借有还,再借不难。在这个过程中,牛牛总共喝了5瓶饮料。 牛牛现在有n个饮料瓶,小卖部的活动是每k个饮料瓶能换一瓶饮料,牛牛最多能喝几瓶饮料? 牛牛已经大彻大悟,现在他拿这道题来考你,他希望你和他一样大彻大悟。

这题需要运用高精度除法,将每一位取出来,加上前一次的余数X10,除后将结果累加,然后更新余数。 还可以这么想:我用k个空瓶换来了1瓶饮料+1个空瓶。我们就可以一直用n-k+1,直到1瓶都换不了了为止。 最后考虑可不可以借1个空瓶?显然只有1种情况:就是当你还差1个空瓶就可以换1瓶饮料的时候。

特判代码:

if(n-k==1) num++;//这里的n和原来的n不同,是有改变的

代码:

#include<bits/stdc++.h>
using namespace std;
vector<int> f(vector<int> A,long long b){
	vector<int> res;
	long long t=0,r=0,len=A.size()-1;
	for(int i=len;i>=0;i--){
		t=r*10+A[i];
		res.push_back(t/b);
		r=t%b;
	}
	reverse(res.begin(),res.end());
	while(res.size()>1 && res.back()==0) res.pop_back();
	return res;
}
int main(){
	freopen("drink.in","r",stdin);
	freopen("drink.out","w",stdout);
	vector <int> A;
	string n;
	long long k;
	cin>>n>>k;
	int len=n.size();
	for(int i=len-1;i>=0;i--) A.push_back(n[i]-'0');
	auto ans=f(A,k-1);
	for(int i=ans.size()-1;i>=0;i--){
		cout<<ans[i];
	}
	return 0;
}
//此代码无特判
//使用auto可能会报错,建议将ans改成vector<int>类型

0 条评论

目前还没有评论...