- 分享
Day2总结(第三题)
- @ 2024-10-3 20:01:38
题目描述
牛牛因为数学太差被老师赶出教室了,虽然老师侵犯了牛牛的公平教育权,但是牛牛在教室外的小卖部大彻大悟,提升了自己的数学水平。 故事是这样的:学校里的小卖部里有一个活动:只要有三个饮料瓶就可以换一瓶新的饮料。现在牛牛从路边捡到了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 条评论
目前还没有评论...