他来到了一家商店门前。
这家商店为了吸引顾客来买快乐水,搞了这么一个活动:「55 个瓶盖换一瓶快乐水」。于是,人们纷纷来他的店里买快乐水。
买完快乐水,他想到了一个问题:
如果一瓶快乐水有m 个附属品,对于第i个附属品,每ai 个可以换一瓶全新的快乐水,现在我有买 n 瓶快乐水的钱,我最多能喝多少快乐水呢?
输入格式
第一行两个整数n,m,意义如上。
接下来一行 m 个整数 1,2,⋯ ,a1,a2,⋯,am,意义如上。
输出格式
如果小 W 可以无限白嫖快乐水,那么输出一行一个字符串 Inf
。
否则,输出一行一个整数 s,表示小 W 最多能喝的快乐水数量。
输入样例1
5 2
2 4
输出样例1
15
输入样例2
2 2
2 2
输出样例2
Inf
说明/提示
样例一解释:
步数 | 已喝 | 未喝 | 附属品一 | 附属品二 |
---|---|---|---|---|
1 | 0 | 5 | 0 | 0 |
2 | 5 | 0 | 5 | 5 |
3 | 5 | 3 | 1 | 1 |
4 | 8 | 0 | 4 | 4 |
5 | 8 | 3 | 0 | 0 |
6 | 11 | 0 | 3 | 3 |
7 | 11 | 1 | 1 | 3 |
8 | 12 | 0 | 2 | 4 |
9 | 12 | 2 | 0 | 0 |
10 | 14 | 0 | 2 | 2 |
11 | 14 | 1 | 0 | 2 |
12 | 15 | 0 | 1 | 3 |
样例二解释:
步数 | 已喝 | 未喝 | 附属品一 | 附属品二 |
---|---|---|---|---|
1 | 0 | 2 | 0 | 0 |
2 | 2 | 0 | 2 | 2 |
3 | 2 | 2 | 0 | 0 |
4 | 4 | 0 | 2 | 2 |
5 | 4 | 2 | 0 | 0 |
6 | 6 | 0 | 2 | 2 |
7 | 6 | 2 | 0 | 0 |
8 | 8 | 0 | 2 | 2 |
9 | ⋮⋮ | ⋮⋮ | ⋮⋮ | ⋮⋮ |
很显然小 W 可以像这样无限白嫖快乐水。
注意:本题中,我们认为无法借还/赊账。
数据范围:
测试点一与样例二相同。
对于其中 30%的数据,n≤100n≤100,n≤2m≤2。
对于 100% 的数据,1≤n≤10^4,1≤m≤5,1≤≤2*10^3。
解析:
1.开longlong
2.最后一个点又卡时间又卡正确性,如果是像我一样的方法就乖乖循环28000000次吧,如果是隔壁题解类型的就去参考他的。
详见code:
#include<iostream>
using namespace std;
int a[6],b[6];//b数组是当前第i个附属品数
int n,m,sum=0,summ=0;//summ是本轮换的快乐水数
long long ans=0;//记得long long
int main(){
cin>>n>>m;
ans+=n;//开局买几瓶就喝几瓶
sum=n;//sum是上一轮换的快乐水数
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);
for(int j=1;j<=28000001;j++)//我试了好久才试出来的TAT
{
for(int i=1;i<=m;i++)
{
b[i]+=sum;//加上上轮瓶子数
summ=summ+b[i]/a[i];
b[i]%=a[i];
}
if(summ>=n)//核心,如果不能白嫖其一轮换的快乐水数一定小于n
{
cout<<"Inf";
return 0;
}
sum=summ;
ans+=summ;
summ=0;
}
cout<<ans;//lld坑了我好几次
return 0;
}
快用你发财的小手点个赞吧!