ZCMU–5018喝可乐–贪心。
题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=5018
Description
可乐有一个很经典的活动:四个瓶盖可以换一瓶可乐
现在zbj一共想喝n瓶可乐,一瓶可乐需要m元,请问他最少需要花多少钱?
P.S.他不可以向别人借瓶盖
Input
第一行一个整数t,表示接下去有t组询问
接下去t行每行包含两个整数n , m ,含义如题
Output
每行输出一个整数表示zbj最少要花的钱
Sample Input
1
1597 3
Sample Output
3594
HINT
对于 20% 的数据, t<=20,n<=50
对于 100% 的数据,t<=10000,0<=n<=100000000 ,1<=k<=200
思路,大致是拆分,先买四瓶可乐,然后以四瓶为为一组,后面都买三瓶就好。而且后面每一组都会有一个是免费的,所以只要记录一共有几组,就有几个免费的。看下图(字丑见谅)
由上图,可以轻松的发现,只要我们将它以4瓶一组分类,除了第一排,下面的全部都会有一个免费的,只要记录有多少免费的,就能找到要买多少。
问题一,1,特判,就是如果总数小于5,那么直接相乘就好
问题二,2,如果不是16个,是17个或者18个怎么办?(也就是有余数)
不难办,由上图最后两个绿色的可以看出,如果有余数,那么必定产生一个免费的,在原来的基础上加一即可。
上AC代码。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
ll num ;
ll price;
cin>>num>>price;
if(num<5) //解决问题一
{
cout<<num*price<<endl;
continue;
}
int t = (num - 4) % 4;
ll cnt = (num-4) / 4;
if(t!=0) cnt++; //解决问题二
num = num - cnt;
cout<<price*num<<endl;
}
return 0;
}
总结,,这题如果想不到,容易把自己整晕。最后,如果对你有帮助,能否给个三连,然后取消收藏就好,不为别的,就为了那一点点的虚荣心。让我更有动力创作