2023-08-10:景区里有m个项目,也就是项目数组为int[][] game,这是一个m*2的二维数组

景区的第i个项目有如下两个参数:

game[i] = { Ki, Bi }

Ki一定是负数,Bi一定是正数

举个例子 :

Ki = -2, Bi = 10

如果只有1个人买票,单张门票的价格为 : Ki * 1 + Bi = 8

所以这1个人游玩该项目要花8元

如果有2个人买票,单张门票的价格为 : Ki * 2 + Bi = 6

所以这2个人游玩该项目要花6 * 2 = 12元

如果有5个人买票,单张门票的价格为 : Ki * 2 + Bi = 0

所以这5个人游玩该项目要花0 * 5 = 0元

如果有更多人买票,都认为花0元(因为你让项目倒贴钱实在是太操蛋了)

于是可以认为,如果有x个人买票,单张门票的价格为 : Ki * x + Bi

x个人游玩这个项目的总花费是 : max { (Ki * x + Bi) * x , 0 }

你作为领导,单位一共有n个人,每个人最多可以选1个项目来游玩,也可以不选任何项目

所有员工将在明晚提交选择,然后由你去按照上面的规则,统一花钱,统一购票

但是现在,你想知道自己需要准备多少钱,就可以应付可能的各种情况,

支持各种可能下的开销,返回这个最保险的钱数。

数据量描述 :

1 <= N、M、Bi <= 10^5,

-(10^5) <= Ki < 0。

来自左程云

答案2023-08-10:

步骤描述:

1.创建一个优先队列(堆)h,用于存储游戏项目。我们使用GameHeap类型来定义优先队列,并实现Len、Less、Swap、Push和Pop方法。

2.遍历每个项目g,在遍历过程中将Ki和Bi作为参数创建Game结构体game,并将其添加到优先队列h中。

3.初始化结果变量ans为0,用于记录总花费。

4.迭代n次,表示有n个人进行选择游戏项目的操作。

4.1.检查当前优先队列h的第一个项目的Earn值(单张门票的价格乘以人数)。如果Earn值小于等于0,即项目不再划算,跳出循环。

4.2.从优先队列h中弹出一个项目,并将其赋值给变量cur。

4.3.将当前项目的Earn值累加到结果变量ans中。

4.4.增加当前项目的人数cur.People。

4.5.将更新后的项目cur添加回优先队列h中。

5.返回结果变量ans,即准备的最保险的金额。

总的时间复杂度:O(nlog(m)),其中n为人数,m为项目数。遍历n次,每次从优先队列中弹出最大值,时间复杂度为log(m)。

总的空间复杂度:O(m),优先队列h的大小取决于项目数m。

go完整代码如下:

package main

import (
"container/heap"
"fmt"
) type Game struct {
Ki int
Bi int
People int
} type GameHeap []Game func (h GameHeap) Len() int { return len(h) }
func (h GameHeap) Less(i, j int) bool { return h[i].Earn() > h[j].Earn() }
func (h GameHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *GameHeap) Push(x interface{}) { *h = append(*h, x.(Game)) }
func (h *GameHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
} func (g Game) Earn() int {
return (2*g.People+1)*g.Ki + g.Bi
} func EnoughMoney(n int, games [][]int) int {
h := &GameHeap{}
heap.Init(h) for _, g := range games {
game := Game{Ki: g[0], Bi: g[1]}
heap.Push(h, game)
} ans := 0
for i := 0; i < n; i++ {
if (*h)[0].Earn() <= 0 {
break
}
cur := heap.Pop(h).(Game)
ans += cur.Earn()
cur.People++
heap.Push(h, cur)
} return ans
} func main() {
games := [][]int{{-2, 10}, {-1, 5}, {-3, 15}}
n := 5
result := EnoughMoney(n, games)
fmt.Println(result)
}

c++完整代码如下:

#include <iostream>
#include <queue>
#include <vector>
using namespace std; struct Game {
int Ki;
int Bi;
int people; Game(int k, int b) {
Ki = k;
Bi = b;
people = 0;
} int earn() const {
return (2 * people + 1) * Ki + Bi;
}
}; struct CompareGame {
bool operator()(const Game& a, const Game& b) {
return a.earn() < b.earn();
}
}; int enoughMoney(int n, vector<vector<int>>& games) {
priority_queue<Game, vector<Game>, CompareGame> heap; for (auto& g : games) {
heap.push(Game(g[0], g[1]));
} int ans = 0; while (n > 0 && heap.top().earn() > 0) {
Game cur = heap.top();
heap.pop(); ans += cur.earn();
cur.people++;
heap.push(cur); n--;
} return ans;
} int main() {
vector<vector<int>> games = { {-2, 10}, {-1, 5}, {-3, 15} };
int n = 5; int result = enoughMoney(n, games);
cout << "Amount needed: " << result << endl; return 0;
}

c语言完整代码如下:

#include <stdio.h>
#include <stdlib.h> struct Game {
int Ki;
int Bi;
int people;
}; typedef struct Game Game; int cmp(const void* a, const void* b) {
Game* gameA = (Game*)a;
Game* gameB = (Game*)b;
return (2 * gameB->people + 1) * gameB->Ki + gameB->Bi - (2 * gameA->people + 1) * gameA->Ki - gameA->Bi;
} int enoughMoney(int n, int games[][2], int m) {
Game* heap = (Game*)malloc(m * sizeof(Game));
for (int i = 0; i < m; i++) {
heap[i].Ki = games[i][0];
heap[i].Bi = games[i][1];
heap[i].people = 0;
} qsort(heap, m, sizeof(Game), cmp); int ans = 0; for (int i = 0; i < n; i++) {
if ((2 * heap[0].people + 1) * heap[0].Ki + heap[0].Bi <= 0) {
break;
}
ans += (2 * heap[0].people + 1) * heap[0].Ki + heap[0].Bi;
heap[0].people++;
qsort(heap, m, sizeof(Game), cmp);
} free(heap); return ans;
} int main() {
int games[][2] = { {-2, 10}, {-1, 5}, {-3, 15} };
int n = 5;
int m = sizeof(games) / sizeof(games[0]); int result = enoughMoney(n, games, m);
printf("Total money needed: %d\n", result); return 0;
}

2023-08-10:景区里有m个项目,也就是项目数组为int[][] game,这是一个m*2的二维数组 景区的第i个项目有如下两个参数: game[i] = { Ki, Bi } Ki一定是负数,的更多相关文章

  1. C语言二维数组作为函数的参数

    前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include < ...

  2. 【面试题003】c数组做为参数退化的问题,二维数组中的查找

    [面试题003]c数组做为参数退化的问题,二维数组中的查找  一,c数组做为参数退化的问题 1.c/c++没有记录数组的大小,因此用指针访问数组中的元素的时候,我们要确保没有超过数组的边界, 通过下面 ...

  3. Arrays类的运用,二分法,数组的复制,命令行参数的运用,二维数组,Object,equals

    /*Arrays jdk中为了便于开发,给开发者提供了Arrays类, 其中包含了很多数组的常用操作.例如快速输出.排序.查找等.*/ import java.util.Arrays; public ...

  4. C++ 二维数组(双重指针作为函数参数)

    本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851 http://blog.csdn.net/xudongdong ...

  5. C语言二维数组作为函数参数

    设有整型二维数组a[3][4]如下:0   1   2   34   5   6   78   9  10  11 它的定义为:    int a[3][4]={{0,1,2,3},{4,5,6,7} ...

  6. 【LeetCode回溯算法#10】图解N皇后问题(即回溯算法在二维数组中的应用)

    N皇后 力扣题目链接(opens new window) n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 n ,返回所有不同的 n 皇 ...

  7. [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组

    13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the n ...

  8. ***php解析JSON二维数组字符串(json_decode函数第二个参数True和False的区别)

    客户端的请求体中的数据:[{"msg_id": 1, "msg_status": "HAS_READ" }, { "msg_id& ...

  9. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  10. 2017.12.10 Java写一个杨辉三角(二维数组的应用)

    杨辉三角的定律 第n行m列元素通项公式为: C(n-1,m-1)=(n-1)!/[(m-1)!(n-m)!] 需要用到创建二维数组 package com.glut.demo; /** * 杨辉三角 ...

随机推荐

  1. 2023-03-16:给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分, 使得所有这些部分表示相同的二进制值。 如果可以做到,请返回任何 [i, j],其中 i+1 < j

    2023-03-16:给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分, 使得所有这些部分表示相同的二进制值. 如果可以做到,请返回任何 [i, j],其中 i+1 < ...

  2. 2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。 你可以按 任意顺序 返回答案。 要求时间复杂度O(N)。 输入: nums = [1,1,1

    2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素. 你可以按 任意顺序 返回答案. 要求时间复杂度O(N). 输入: nums = [1,1,1 ...

  3. 2021-02-13:字符串str最少添加多少个字符变成回文串?

    福哥答案2020-02-13: 假设字符串str是"abcde12344321",在str后添加"edcba"即可变成回文串.需要添加5个字符. 解法:包含最后 ...

  4. 2021-04-19:手写代码:最小生成树算法之Kruskal。

    2021-04-19:手写代码:最小生成树算法之Kruskal. 福大大 答案2021-04-19: 并查集.边从小到大,找最小边,无环. 代码用golang编写.代码如下: package main ...

  5. 2021-08-04:给定一个字符串str,当然可以生成很多子序列。返回有多少个子序列是回文子序列,空序列不算回文。比如,str = “aba”,回文子序列:{a}、{a}、 {a,a}、 {b}、{

    2021-08-04:给定一个字符串str,当然可以生成很多子序列.返回有多少个子序列是回文子序列,空序列不算回文.比如,str = "aba",回文子序列:{a}.{a}. {a ...

  6. Java的CAS操作

    介绍 CAS 技术是为了解决问题而生的,通过 CAS 我们可以以无锁的方式,保证对共享数据进行 "读取 - 修改 - 写回" 操作序列的正确性. CAS 是乐观锁设计思想的实现.C ...

  7. L2-004 这是二叉搜索树吗? (25 分)

    1.题目描述: 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树 ...

  8. C# 客户端程序 Visual Studio 远程调试方法

    传统桌面客户端的远程调试相比UWP,ASP等项目来说,配置比较麻烦,因为它是非部署的应用程序,原理是复制编译的文件到远程计算机,通过网络来连接和VS的通信,本文主要讲述WPF,WinForm应用程序的 ...

  9. 楠少音乐盒(PC端)突破校园网限制

    楠少音乐盒 突破校园网限制 最近在将音乐盒从web迁移到PC端,过程中的记录 在我们学校,工作时间内(周一至周五为工作日,下午上班时间)校园网都会拦截一些与工作无关的网站,例如购物.炒股.游戏.音乐等 ...

  10. java中Object 类

    一. Object类简介 Object类是Java.java.lang包下的核心类,Object类是所有类的父类,任何一个类如果没有明确的继承一个父类的话,那么它就是Object的子类: (使用无需导 ...