一名用户在不定时地在保险机构购买保险,每次投保会产生保险额度 amnt、生效日 valdate、终止日 enddate,保险额度只在生效日和终止日之间有效([startdate, endate],包含边界值),多次投保时日期可重叠,现要求一个时间段 [t1, t2] 内生效保险额度的最大值。
amntList = [[amnt1, startdate1, enddate1], [amnt2, startdate2, enddate2], [amnt3, startdate3, enddate3], ... , [amntN, startdateN, enddateN]]
例:
保险额度 | 生效日 | 终止日 |
---|---|---|
30 | 2023/1/1 | 2023/6/1 |
50 | 2023/5/8 | 2023/10/8 |
90 | 2023/12/10 | 2023/4/10 |
30 | 2023/7/1 | 2023/8/1 |
40 | 2023/7/15 | 2023/12/15 |
时间范围为[2023/4/4, 2024/4/4],在这个时间段内该用户的最大有效保险金额为130。
提供思路或代码均可,我实在想不出思路,总不能遍历每一天然后看哪天的金额最多吧,谢谢
/**
* 有三个线程,线程一只打印t1,线程二只打印t2,线程三只打印t3,在控制台上输出t1 t2 t3 。。循环5遍
* 之后输出t2 t3 t1。。5遍 再输出t3 t1 t2。。5遍之后就循环
* @author Administrator
* 解题思路: 线程T1T2T3, 顺序执行5遍之后,改变线程执行顺序为T2T3T1执行5遍,再改变顺序执行T3T1T2线程执行5遍,然后在回到原来的顺序,如此循环
*/
public class test2 {
static int count = 0;
static Object lock = new Object();
//初始线程顺序位标识
static int a = 0;
static int b = 1;
static int c = 2;
public static void main(String[] args) {
new Thread(()->{
synchronized (lock) {
while(true){
try {
if(count%3 == a) {
System.out.print("t1");
count++;
if(count%15 == 0) { //改变线程执行顺序
a = (a+2)%3;//1
b = (b+2)%3;//2
c = (c+2)%3;//0
System.out.println(",输出5次t2t3t1完毕,改变线程执行顺序位a="+a+",b="+b+",c="+c);
Thread.sleep(500L);
}
lock.notifyAll();
}else {
lock.wait();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(()->{
synchronized (lock) {
while(true){
try {
if(count%3 == b) {
System.out.print("t2");
count++;
if(count%15 == 0) { //改变线程执行顺序
a = (a+2)%3;//0
b = (b+2)%3;//1
c = (c+2)%3;//2
System.out.println(",输出5次t3t1t2完毕,改变线程执行顺序位a="+a+",b="+b+",c="+c);
Thread.sleep(500L);
}
lock.notifyAll();
}else {
lock.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(()->{
synchronized (lock) {
while(true){
try {
if(count%3 == c) {
System.out.print("t3");
count++;
if(count%15 == 0) { //改变线程执行顺序
a = (a+2)%3;//2
b = (b+2)%3;//0
c = (c+2)%3;//1
System.out.println(",输出5次t1t2t3完毕,改变线程执行顺序位a="+a+",b="+b+",c="+c);
Thread.sleep(500L);
}
lock.notifyAll();
}else {
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
打印结果: