爱奇艺笔试题之成长值计算

来源:互联网 发布:mastercam9.1四轴编程 编辑:程序博客网 时间:2024/06/15 09:38

题意如下:

成长值计算
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
爱奇艺累计有2000万会员,为了提高会员权益以及减少运营成本,我们需要对用户分等级差异化运营,为此我们制定了用户成长体系,按成长值(最小为0)划分为不同等级。成长值计算公式为:
会员成长值=每天成长值+任务成长值
现在我们输入一组数据,表示用户的成长值计算规则,比如某个用户的每天成长值规则1 1 5 10,第一列1表示每日成长值规则,第二列1表示该条规则的生效开始时间,第三列5表示该条规则的生效截至时间,第四列10表示该条规则的每天成长值,则用户初始值为0,第1天到第5天,每天成长值10点,则第5天成长值为50;另外任务成长值规则,比如2 3 4,第一列2表示该规则为任务成长值,第二列3表示第三天做任务,第三列4表示该天做任务得到成长值4。现在输入一组数据,每行一条成长规则,每日成长规则生效时间重合时以成长数值最大的为准,每日成长值是每天0点更新,任务成长值是0点以后,要求计算成长值规则对应最后一天成长值。
输入
输入数据有多行,第一列为1时,该行会有4个数值,第一列为2时,该列会有3个数值
输出
对于每个测试实例,初始成长值都为0,计算成长值规则最后一天的用户成长值。


样例输入
1 1 5 10
2 3 4
1 4 6 -5
样例输出
49



解决该问题可以用最直接的思路,首先将每条规则存下来,然后从最小天数开始到最大天数依次得到下一个要计算的区间,例如样例中,首先是1-5,每天成长值为10(因为第一条规则第五天的成长值大于第三条,所以第五天的成长值按照第一条规则来计算),下一条规则是5-6,每天成长值为 -5,最后再加上任务的成长值可以得到最总结果为49.


以上思路可以解决问题,但是总体解决思路比较乱,需要考虑的情况有很多,因为有可能很多条规则都有重复,这时候需要遍历这些规则找到最合适下一条规则。

还有另一种思路,即将成长区间转化为每天的成长,化整为零,这样思路就简单了很多。具体操作如下:

首先将每条规则都读取进来,并且在读取的时候就确定开始时间与结束时间,然后声明一个数组,大小为总的天数,数组中每个元素代表该天的成长值。然后再遍历每条规则,将该规则的成长值写入到该数组中,当然,每天的成长值都取最大的那个成长值。最后,将该数组求和即可。

具体代码如下:


import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int value = 0;        int minDay = Integer.MAX_VALUE;        int maxDay = Integer.MIN_VALUE;        List<Integer> mins = new ArrayList<>();        List<Integer> maxs = new ArrayList<>();        List<Integer> values = new ArrayList<>();        while (in.hasNextLine()) {            String line = in.nextLine();            if (line.isEmpty())                break;            String[] strs = line.split(" ");            if (strs.length == 3) {                if (Integer.valueOf(strs[2]) > 0)                    value += Integer.valueOf(strs[2]);            } else {                int min = Integer.valueOf(strs[1]);                int max = Integer.valueOf(strs[2]);                if (min < minDay) minDay = min;                if (max > maxDay) maxDay = max;                mins.add(min);                maxs.add(max);                values.add(Integer.valueOf(strs[3]));            }        }        int[] DICT = new int[maxDay + 1];        for (int j = minDay; j <= maxDay; ++j) {            DICT[j] = Integer.MIN_VALUE;        }        for (int i = 0; i < mins.size(); ++i) {            for (int j = mins.get(i); j <= maxs.get(i); ++j) {                if (DICT[j] < values.get(i)) {                    DICT[j] = values.get(i);                }            }        }        for (int i = minDay; i <= maxDay; ++i) {            value += DICT[i];        }        System.out.println(value);    }}

0 0