快乐时间最大化

54 阅读1分钟

问题描述

小C喜欢在电子书城阅读书籍,并希望获得尽可能多的满足感。每本书的满意程度books[i]表示小C阅读这本书的评分。如果按照顺序阅读书籍,time[i]定义为阅读第i本书及之前所有书所花费的时间,即第i本书的快乐时间系数为time[i] * books[i]。小C可以按照任意顺序调整书籍的阅读顺序,以获得最大的【快乐时间】总和。

例如,给定的书籍评分是 [4, 3, 2],如果按评分升序排序来安排阅读,则小C可以获得最大的快乐时间系数。


测试样例

样例1:

输入:books = [4, 3, 2]
输出:20
说明:选择第一天读第三本书,第二天读第二本书,第三天读第一本书,快乐时间为20,可以证明,没有其他方案获得的快乐时间比此方案更大

样例2:

输入:books = [-1, -4, -5]
输出:0
说明:无论怎么读,最后的快乐时间均为负数,所以选择不读,快乐时间为0

样例3:

输入:books = [-1, -8, 0, 5, -9]
输出:14
说明:选择第一天读第一本书,第二天读第三本书,第三天读第四本书,快乐时间为14,可以证明,没有其他方案获得的快乐时间比此方案更大

import java.util.Arrays;
public class Main {
     public static int solution(int[] books) {
        Arrays.sort(books);
        int i,len=books.length-1,j,sum=0,tmp;
        for(i=len;i>-1;i--){
            tmp=sum;
            for(j=len;j>=i;j--){
                tmp+=books[j];
            }
            if(tmp>sum){
                sum=tmp;
            }
        }

        return sum;
    }

    public static void main(String[] args) {
        System.out.println(solution(new int[]{4, 3, 2}) == 20);
        System.out.println(solution(new int[]{-1, -4, -5}) == 0);
        System.out.println(solution(new int[]{-1, -8, 0, 5, -9}) == 14);
    }
}