ZCMU1854 zbj的可乐(模拟)
Description
zbj最近特别想喝可乐,然而可口可乐有一个万年梗的活动就是....四个瓶盖换一瓶可乐的活动 现在zbj想喝n瓶可乐,一瓶可乐需要k元,问他最少需要花多少钱? ps.一瓶可乐只有一个瓶盖..当然这不是脑筋急转弯,zbj并不能向别人借瓶盖。
Input
有多组样例,每一行输入一个正整数n,k(0<=n<=100000000 1<=k<=200) (请不要嘲讽zbj能喝...我们要友好和谐)
Output
每一行输出一个正整数表示zbj最小需要花的钱
Sample Input
1597 3
Sample Output
3594
思路
一开始我是直接对可乐数除以4,算出免费的可乐,再算价格。这样是错的,因为这样子并没有考虑到免费的可乐也会提供瓶盖,即四瓶免费可乐能再换一瓶,新的四瓶能再再换。。。。
之后我用纸笔模拟如下买可乐的过程,0为免费可乐
1 2 3 4 0 1 2 3 0 1 2 3 0 1 2 3 0 1....
只要将n对4取余数,n-n%4前的可乐可分割成(n-n%4)/4个块,除第一个块花了4k元,之后每个花了3k元, 这模拟出了具体花钱的过程。再对余数进行讨论:被整除或余1均不花钱,否则再花 (余数-1)*k元,最后相加即可。
注意
0<=n<=100000000 数据要定义为long long型,int型不够大。
代码
#include<bits/stdc++.h>
using namespace std;
long long ans;
int main()
{
//freopen("fopen.txt","r",stdin);
//freopen("fout.txt","w",stdout);
long long n;
int k;
while(~scanf("%lld %d",&n,&k))
{
if(n==0)
{
printf("0\n");
continue;
}
else if(n<=4)
{
ans=n;
}
else if(n%4==1||n%4==0)
{
ans=(4+(n/4-1)*3);
}
else
{
ans=(4+(n/4-1)*3+(n%4-1));
}
printf("%lld\n",ans*k);
}
return 0;
}