• [USACO09MAR]Moon哞哞叫Moon Mooing(模拟)


    链接:https://ac.nowcoder.com/acm/contest/1086/F
    来源:牛客网

    题目描述

    A full moon casts some sort of spell on the cows and, like their cousins the wolves and coyotes, they bay at the moon -- mooing instead of howling, of course.
    Each 'moo' lasts a certain amount of time. A short 'moo' might last time 1; a longer one might last time 24 or even 1,000,000,000 or longer (cows can really moo when they want to). No 'moo' will last more than or equal to 2^63.
    It should come as no surprise that the cows have a pattern to their moos.  Bessie will choose an integer c (1 <= c <= 100) that is the initial length of a moo.
    After Bessie moos for length c, the cows calculate times for subsequent moos. They apply two formulae to each moo time to yield even more moo times. The two formulae are:
            f1(c)=a1*c/d1+b1 (integer divide, of course) and
            f2(c)=a2*c/d2+b2.
    They then successively use the two new times created by evaluating f1(c) and f2(c) to create even more mooing times. They keep a sorted list of all the possible mooing times (discarding duplicates).
    They are allowed to moo a total of N times (1 <= N <= 4,000,000). Please determine the length of the longest moo before they must quit.
    The constants in the formulae have these constraints: 1 <= d1 < a1; d1 < a1 <= 20; 0 <= b1 <= 20; 1 <= d2 < a2; d2 < a2 <= 20; 0 <= b2 <= 20.
    Consider an example where c=3 and N=10. The constants are:
        a1=4    b1=3     d1=3
        a2=17   b2=8     d2=2
    The first mooing time is 3, given by the value of c. The total list of mooing times is:
         1. c=3             ->  3       6. f2(3)=17*3/2+8  -> 33
         2. f1(3)=4*3/3+3   ->  7       7. f1(28)=4*28/3+3 -> 40
         3. f1(7)=4*7/3+3   -> 12       8. f1(33)=4*33/3+3 -> 47
         4. f1(12)=4*12/3+3 -> 19       9. f1(40)=4*40/3+3 -> 56
         5. f1(19)=4*19/3+3 -> 28      10. f1(47)=4*47/3+3 -> 65
    The tenth time is 65, which would be the proper answer for this set of inputs.

    输入描述:

    * Line 1: Two space-separated integers: c and N
    * Line 2: Three space-separated integers: a1, b1, and d1
    * Line 3: Three space-separated integers: a2, b2, and d2

    输出描述:

    * Line 1: A single line which contains a single integer which is the length of the Nth moo

    示例1

    输入

    3 10 
    4 3 3 
    17 8 2 

    输出

    65

    一道类似两个序列合并的东西,通法就是上一个优先队列就好了,但是这道题会超时。

    但是,仔细观察一下,序列是单增的(a>c),这就很好办了,类似做一个归并就好了。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <math.h>
     6 #include <algorithm>
     7 #include <vector>
     8 #include <queue>
     9 #include <set>
    10 #include <map>
    11 #include <math.h>
    12 const int INF=0x3f3f3f3f;
    13 typedef long long LL;
    14 const int mod=1e9+7;
    15 const int maxn=4*1e6+10;
    16 using namespace std;
    17 
    18 LL ans[maxn];//ans数组是一个递增队列
    19 
    20 int main()
    21 {
    22     int c,n,a1,b1,d1,a2,b2,d2;
    23     scanf("%d %d %d %d %d %d %d %d",&c,&n,&a1,&b1,&d1,&a2,&b2,&d2);
    24     int cnt=1;//队列计数器 
    25     int f1=1,f2=1;//函数计数器 
    26     ans[cnt++]=c;//初始元素c入队
    27     while(cnt<=n)
    28     {
    29         LL t=min(a1*ans[f1]/d1+b1, a2*ans[f2]/d2+b2);//取F1()和F2()中的较小值
    30         ans[cnt++]=t;//将该较小值入队
    31         if(t==a1*ans[f1]/d1+b1)//如果较小值来自F1(),则将F1()的指针f1+1
    32             f1++;
    33         if(t==a2*ans[f2]/d2+b2)//如果较小值来自F2(),则将F2()的指针f2+1
    34             f2++;
    35     }//重点理解while循环的内容。因为算出的F1()或F2()的数据单调递增,所以可以用这样的方式生成整个数列
    36     printf("%lld",ans[n]);//最后输出即可。
    37     return 0;
    38 }
  • 相关阅读:
    java基础(8)---接口和lambda
    asp.net ashx处理程序中switch case的替代方案总结
    C# 委托(delegate)、泛型委托和Lambda表达式
    js判断浏览器是否安装或启用了flash的方法总结
    ASP.NET登录验证码解决方案
    C#读取匿名对象的属性值的方法总结
    C#中char[]与string之间的转换;byte[]与string之间的转化
    【Sublime】Sublime 常用插件
    js ajax设置和获取自定义header信息的方法总结
    .Net 通过设置Access-Control-Allow-Origin来实现跨域访问
  • 原文地址:https://www.cnblogs.com/jiamian/p/11494876.html
Copyright © 2020-2023  润新知