爱奇艺笔试题之成长值计算
来源:互联网 发布: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); }}
- 爱奇艺笔试题之成长值计算
- stm32成长记之定时器时间计算
- C 笔试题 【错误累积成长】
- 华为笔试题 计算下一秒
- 笔试题-计算时间戳
- 可信云计算,点亮企业成长之路
- 程序员成长之路---“学习”与“面试笔试”总结篇之曲折的成长历程与求职历程
- 程序员成长之路---“学习”与“面试笔试”总结篇之曲折的成长历程与求职历程
- 笔试题总结归纳之商汤科技(sensetime)——计算视觉研究院
- 笔试题:计算N的阶乘
- 华为上机笔试题 计算字符个数
- 笔试题之Linux
- 笔试题之数据库
- 哈希表之笔试题
- 【上机笔试之五】计算两个日期的差值
- Android笔试之JAVA笔试题总结
- 笔试面试之编程题
- 笔试题之寿命估计
- [kuangbin带你飞]专题五 并查集 H POJ 1733
- elasticsearch sql的安装
- 7.3.2 Using Backups for Recovery 使用备份用于恢复
- [小技巧] 使用 diff 命令来比较标准输出
- 对象数组的排序问题,设置对象某一属性的优先级最高
- 爱奇艺笔试题之成长值计算
- IP地址,子网掩码、默认网关,DNS服务器是什么意思?
- Java 8的新特性—终极版
- hdu 2546 饭卡(0-1)
- 拦截过滤器模式和数据规则
- leetCode练习(81)
- Centos7安装redis3.0
- Ubuntu添加用户并赋sudo权限
- git 错误: