bzoj 1583
Description
Input
第一行两个数,C和N
第二行3个数,a1,b1,c1 第三行3个数,a2,b2,c2
Output
一个整数代表最长的那一次嚎叫
Sample Input
3 10
4 3 3
17 8 2
4 3 3
17 8 2
Sample Output
65
思路: 贪心,用一个队列,模拟两个指针,即当前两个公式可以产生的最小值。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 ll c,n,a1,b1,c1,a2,b2,c2; 5 ll q[5000003]; 6 int main(){ 7 scanf("%lld%lld",&c,&n); 8 scanf("%lld%lld%lld",&a1,&b1,&c1); 9 scanf("%lld%lld%lld",&a2,&b2,&c2); 10 int x=1,y=1,num=1; 11 q[1]=c; 12 for(int i=2;i<=n;i++){ 13 ll v1=q[x]*a1/c1+b1; 14 ll v2=q[y]*a2/c2+b2; 15 if(v1<v2) q[i]=v1,x++; 16 else if(v2<v1) q[i]=v2,y++; 17 else q[i]=v1,x++,y++; 18 } 19 cout<<q[n]<<endl; 20 return 0; 21 }