cf1512F. Education
作者:互联网
题意:
小明想买一个价值为c的东西,他开始打工,他一开始在第i个职务,每天可以挣a[i],他也可以用一天的时间并且花费b[i]升到i+1职务,第i+1职务每天可以挣a[i+1]
一共有n个职务,问他最少要多少天才能攒够钱c
2<=n<=2e5
题解:
看看数据范围。。这题直接暴力就行emm
我们直接计算在第i个岗位挣到c需要多少钱,取最小值
因为岗位需要一步一步升,所以到第i个岗位时,要计算好升到第i个岗位所需要的时间,以及当前的钱
详细看看代码,注意细节就行
(比赛时都没看到这题)
代码:
#include<bits/stdc++.h>
#define debug(x,y) printf("%s = %d\n",x,y);
typedef long long ll;
using namespace std;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
}
const int maxn=2e5+9;
ll a[maxn];
ll b[maxn];
int main()
{
int t;
cin>>t;
while(t--){
ll n,c;
cin>>n>>c;
ll minn=1e13+9;
for(int i=1;i<=n;i++)a[i]=0;
for(int i=1;i<n;i++)b[i]=0;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<n;i++)scanf("%lld",&b[i]);
ll tot=0;
ll preday=0;
ll pretot=0;
for(int i=1;i<=n;i++)
{
tot=preday+ceil(1.0*(c-pretot)/(1.0*a[i]));//到此为止
ll w=ceil(1.0*(b[i]-pretot)/(1.0*(a[i])));//晋升所需要的天数
preday+=w+1;
pretot+=(w*a[i])-b[i];
minn=min(tot,minn);
}
printf("%d\n",minn);
}
}
标签:ch,1.0,minn,int,ll,cf1512F,while,Education 来源: https://blog.csdn.net/qq_35975367/article/details/116029916