阿里评测—空闲时间/公益机会/公益积分

该博客介绍了一个积分管理系统,重点在于如何通过优化算法确保用户必须全程参与公益活动才能获得积分。程序读取用户的空闲时间和工作时间,计算每个时间段内做公益可获得的最大积分,并更新总积分。最后,它遍历所有空闲时间,累加积分,得出总积分值。文章涉及了矩阵运算、时间区间处理和数值比较,展示了如何在实际场景中应用这些技术来解决复杂问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公益机会需要从开始到结束全程参与才能获得积分在这里插入图片描述

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) throws IOException {
        double[][] val=new double[25][25];
        for(int i=0;i<25;i++){
            for(int j=0;j<25;j++){
                val[i][j]=0.0;
            }
        }
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String[] free=br.readLine().split(";");
        int[][] freetime=new int[free.length][2];
        for(int i=0;i<free.length;i++){
            String[] cur=free[i].split("-");
            freetime[i][0]=Integer.parseInt(cur[0]);
            freetime[i][1]=Integer.parseInt(cur[1]);
        }
        String[] work=br.readLine().split(";");
        int begin,end;
        for(int i=0;i<work.length;i++){
            String[] time=work[i].split(":");
            String[] cur=time[0].split("-");
            begin=Integer.parseInt(cur[0]);//公益开始时间
            end=Integer.parseInt(cur[1]);//公益结束时间
            double value=Double.valueOf(time[1]);
            val[begin][end]=Math.max(val[begin][end],value);//这个时间段内做公益获得积分最大值
        }
        //printArray(val);
        for (int i = 0; i < val.length; i++) {
                for (int j = i+1; j < val.length; j++) {
                    for (int k = i+1; k < j; k++) {
                    double tmp = (isEqual(val[i][k], 0) && isEqual(val[k][j], 0)) ? 0.0 : (val[i][k] + val[k][j]);
                    if (val[i][j] < tmp) {
                        val[i][j] = tmp;
                    }
                }
            }
        }
        printArray(val);
        //遍历空闲时间
        double totalval=0;
        for(int i=0;i<freetime.length;i++){
            int first=freetime[i][0];
            int last=freetime[i][1];
            totalval+=val[first][last];
            }
        System.out.println(totalval);
    }
    static void printArray(double[][] value){
        int row=value.length;
        int col=value[0].length;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(value[i][j]!=0){
                    System.out.println(i+" "+j+" "+value[i][j]);
                }
            }
        }
    }
    static boolean isEqual(double a, double b){
        BigDecimal data1 = new BigDecimal(a);
        BigDecimal data2 = new BigDecimal(b);
        if(data1.compareTo(data2)==0){
            return true;
        }
        return false;
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值