首页 > 其他分享 >最大开支(优先队列+贪心)

最大开支(优先队列+贪心)

时间:2024-03-27 10:58:37浏览次数:23  
标签:java Scanner 队列 开支 util int new import 贪心

我的bfs(超时了捏)

 

 1 import java.util.*;
 2 
 3 import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
 4 
 5 public class Demo1 {
 6     static int m;
 7     static int n;
 8     static long sum;
 9     public static void main(String[] args) {
10         Scanner scan=new Scanner(System.in);
11         n=scan.nextInt();
12         m=scan.nextInt();
13         int [][]h=new int[m][2];
14         for(int i=0;i<m;i++) {
15             h[i][0]=scan.nextInt();
16             h[i][1]=scan.nextInt();
17         }
18         BFS(1,0,0,h);
19         scan.close();
20         System.out.println(sum);
21     }
22     public static void BFS(int start,int level,int s,int [][]h) {
23         if(level==m||start>n) {
24             if(s>sum) {
25                 sum=s;
26             }
27             return ;
28         }else {
29             for(int i=start;i<=n;i++) {
30                 int t=(h[level][0]*(i-start+1)+h[level][1])*(i-start+1);
31                 int temp=Max(t,0);
32                 s+=temp;
33                 BFS(i+1,level+1,s,h);
34                 s-=temp;
35             }
36         }
37     }
38     public static int Max(int t,int w) {
39         if(t>w) {
40             return t;
41         }else {
42             return w;
43         }
44     }
45 
46 }

 后来可以考虑增量,所有活动买第一张增量都是k*1+b,然后买下一张就是(k*(x)+b)*x-(k*(x-1)+b)*(x-1),然后对这些增量都排个序,一直选最大的就可以了!!!(秒秒秒)

 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 import java.util.Collection;
 4 import java.util.Collections;
 5 import java.util.Comparator;
 6 import java.util.Iterator;
 7 import java.util.List;
 8 import java.util.Scanner;
 9 
10 public class Main {
11     public static  void main(String[] args) {
12         Scanner sc=new Scanner(System.in);
13         int N=sc.nextInt();
14         int M=sc.nextInt();
15         List<Integer> a=new ArrayList<>();
16         for (int i = 1; i <= M; i++) {
17             int k=sc.nextInt();
18             int b=sc.nextInt();
19             for (int j = 1; j <= N; j++) {
20                 int count=(k*j+b)*j-(k*(j-1)+b)*(j-1);
21                 if (count>0) {
22                     a.add(count);
23                 }else {
24                     break;
25                 }
26             }
27         }
28         Collections.sort(a, (o1,o2)-> o2-o1);
29 //           Collections.sort(a, new Comparator<Integer>() {
30 //                @Override
31 //                public int compare(Integer o1, Integer o2) {
32 //                    return o2-o1;
33 //                }
34 //            });
35         long max =0;
36         int choose=Math.min(N, a.size());
37         for (int i = 0; i < choose; i++) {
38             max+=a.get(i);
39         }
40         System.out.println(max);
41     }
42 }

 

标签:java,Scanner,队列,开支,util,int,new,import,贪心
From: https://www.cnblogs.com/saucerdish/p/18085691

相关文章

  • 扫地机器人 二分答案,贪心 蓝桥杯
    二分答案与二分查找类似,二分查找有一个前提就是数列要求是有序的,二分答案则是要求满足条件的答案是单调有序的,它的基本思想是在答案可能的范围([L,R])内二分查找答案,不断检查当前答案是否满足题目的要求,根据检查结果更新查找的区间,最终取得最符合题目要求的答案进行输出。......
  • 代码随想录算法训练营day35 | leetcode 860. 柠檬水找零、406. 根据身高重建队列、452
    目录题目链接:860.柠檬水找零-简单题目链接:406.根据身高重建队列-中等题目链接:452.用最少数量的箭引爆气球-中等题目链接:860.柠檬水找零-简单题目描述:在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一......
  • LeetCode 11.盛最多的水(双指针,贪心)
    题目:思路:我们可以安排俩个指针(数组下标)放在数组的头部和尾部;每次移动高度较低的下标,判断是否为最大水量并记录;(水量=下标差乘较小高度)证明可行性:如果移动高度较高的下标,由于下标差减小,故不论后面下标对应的高度增大,不变或减小都会导致水量减小;(增大:下标差减小,较小高度......
  • GCD 并发队列来实现多读单写
     iOS的多读单写指的是多个线程可以同时读取共享的数据,但是只有一个线程能够写入数据。这是为了保证数据的一致性和避免竞争条件的出现。一在Objective-C中,可以使用GCD的并发队列来实现多读单写。具体实现步骤如下:1.定义一个并发队列和一个串行队列,用于处理读操作和写操......
  • 实时数仓之Flink消费kafka消息队列数据入hbase
    一、流程架构图 二、开源框架及本版选择    本次项目中用到的相关服务有:hadoop、zookeeper、kafka、maxwell、hbase、phoenix、flink   三、服务部署完成后,开发Flink主程序  3.1结构图如下:      3.2代码详细内容  3.2.1pom文件<?xml......
  • 灵茶之贪心模拟01
    灵茶之贪心模拟01题目链接https://codeforces.com/problemset/problem/1443/B题目大意输入T(≤\(10^5\))表示T组数据。所有数据的字符串长度之和≤\(10^5\)。每组数据输入a(1≤a≤1000)b(1≤b≤1000)和长度不超过\(10^5\)的01字符串。你可以花费a,把一段连续的......
  • 线程池的创建方式、七个参数、拒绝策略、阻塞队列、线程池大小设定
    线程池的创建方式1、通过Executors的静态方法可以创建四种类型的线程池。(不推荐)1)FixedThreadPool创建一个固定线程数的线程池,线程数量一直保持固定不变,如果任务提交时,没有空闲线程,那就进入任务队列,当有空闲时间时,再执行任务队列中的任务。2)SingleThreadExecutor线程池中......
  • 栈与队列理论基础
    队列是先进先出,栈是先进后出。在Java中,栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。以下是栈的基本操作以及对应的方法:入栈(Push):将元素添加到栈的顶部。对应方法:push(Eitem),将元素 item 推入栈顶。出栈(Pop):从栈的顶部移除并返回元素。对应方法:pop(),移除并返回栈顶元素......
  • 卡码java基础课 | 20.排队取奶茶(队列)
    学习内容:队列的基本概念(队头、队尾)和特点(先入先出)双端队列入队、出队、获取队头元素和判断队列是否为空等基本操作ArrayDeque的使用重点归纳:队列,先入先出,FIFO,firstinfirstout。双端队列,同时实现两端的添加和删除操作,即同时有队列和栈的特性。使用方法:导入Queue接口和队......
  • 蓝桥杯算法集训 - Week 4:BFS、并查集、Flood Fill、哈希、单调栈/队列
    蓝桥杯算法集训-Week4本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、BFSBFS算法复习参考:BFS(Java)广度优先搜索简单介绍、模板、案例(一)Ⅰ、代码模板staticvoidbfs(Troot){//双端队列,用来存储元素D......