1 条题解
-
0
题解:P2942 [USACO09MAR] Moon Mooing G
简化题意
第一行给出 和 ,第二行给出 和 和 三个数,第三行给出 和 和 三个数。然后用两条公式不断地迭代、计算,剔除重复的时长,取前 个整数为 次哞叫的时长。
也就是说,求 的数值。
大致思路
首先定义数组 ,长度为 ,用来储存每一次的叫声。使得 的值为 。
然后使用循环迭代,每一次使用两个公式( 和 )求出 和 。
f1=a1*a[m1]/d1+b1; f2=a2*a[m2]/d2+b2;然后,在每一次循环中,都对 和 进行判断。分为三种情况:
- 如果 ,那么 赋值为 ,且 要加一;
- 如果 ,那么 赋值为 ,且 要加一;
- 如果 ,那么 赋值为 ,且 与 都要加一。
if(f1<f2){ a[i]=f1; m1++; }else if(f1>f2){ a[i]=f2; m2++; }else{ a[i]=f1; m1++,m2++; }可以化简为:
- 等于 和 中的较小值;
- 如果 ,那么 要加一;
- 如果 ,那么 要加一。
a[i]=min(f1,f2); if(f1<=f2)m1++; if(f1>=f2)m2++;其它内容放在代码里了。
代码实现
#include<bits/stdc++.h> #define ll long long using namespace std; ll a[4000010],c,n,a1,b1,d1,a2,b2,d2,m1=1,m2=1,f1,f2; int main(){ cin>>c>>n>>a1>>b1>>d1>>a2>>b2>>d2; a[1]=c; for(ll i=2;i<=n;i++){ f1=a1*a[m1]/d1+b1; f2=a2*a[m2]/d2+b2; a[i]=min(f1,f2); if(f1<=f2)m1++; if(f1>=f2)m2++; }cout<<a[n]; return 0; }
- 1
信息
- ID
- 1531
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者