当前位置: 代码迷 >> 综合 >> 7-10 Rhythm买娃哈哈 (10分) ---不妨找找规律
  详细解决方案

7-10 Rhythm买娃哈哈 (10分) ---不妨找找规律

热度:32   发布时间:2024-02-01 11:42:25.0

 

一瓶娃哈哈(玻璃瓶装的)两块钱,因为瓶身是玻璃瓶的比较贵,所以两个瓶身可以换一瓶娃哈哈。

你现在有4元钱,问最多能喝到多少瓶娃哈哈?

答案是4瓶。

一开始先用4元钱买两瓶娃哈哈喝掉,再用这两瓶的娃哈哈的瓶身换一瓶喝到,最后还剩一个瓶身,这个时候再朝小卖部的老板借一个瓶身。换一瓶娃哈哈喝掉之后再还给他一个瓶身。

现在问题来了,Rhythm有n元钱,然后Rhythm最多可以向老板借一个瓶身(注意要还的),问Rhythm最多能喝到多少瓶娃哈哈?

输入格式:

第一行是一个正整数T(T<=100)表示有T组案例。

对于每组案例,输入一个正整数(1<=n<=10^100)。

输出格式:

对于每组案例,输出一行一个正整数表示最多能够喝到的娃哈哈数目

输入样例:

1
1

输出样例:

0

 

 

 


题解

 

还是思路不够广。我只想到了模拟的思路,想着N不停除2,然后不同的情况。但试验后发现似乎很复杂,当时没看明白。

其实,这就是个简单的找规律题。顺便,为了让它还算有点难度,于是加上了大数(高精度)思想。

 

对应不同N,不同结果表

N元钱 1 2 3 4 5 6 7 8 9 10
喝到的瓶数 0 2 2 4 4 6 6 8 8 9

手算模拟时,就可以感觉到,额外多的1元钱是没用的,所以2和3,4和5,6和7对应的瓶数各个对应相等。

这一点要注意到,算是个细节。因为在我之前模拟的时候,常常会把N元钱直接当成空瓶来算。这1元钱混淆成1个空瓶子,而实际上1元钱没办法加上一个空瓶再换一瓶。这份混淆给我的结果带来很大影响。

 

规律挺明显的,奇数N与偶数N-1对应相等。偶数N对应瓶数就是N。

 

除此之外,就是题中的 1<=n<=10^100 。

n最大有100位,哪怕用long long ,为64位。数据范围为 - 2^63 ~ 2^63-1 ,右侧也就是 9,223,372,036,854,775,807,共19位,差得远呢。

所以自然要大数处理,也就是用数组一位一位存。

 

ac代码

#include<bits/stdc++.h>
using namespace std;int main()
{int T;char a[1000];int result[1000];cin>>T;while(T--){cin>>a;for(int i=0;a[i]!='\0';i++)	    result[i+1] = a[i]-'0';	//1~strlenif(result[strlen(a)]%2!=0){result[strlen(a)]--;}for(int i=1;i<=strlen(a);i++)cout<<result[i];	cout<<endl;}return 0;
}

当然,这里有个小细节我没处理。也就是个位数的-1,如果它正好为0,便要从十位来取,十位为0,要取百位...

寻思它没这么刁钻,我也就没管,直接就过了。

  相关解决方案