【AcWing每日一题】4818. 奶牛大学

news2024/9/24 19:19:23

Farmer John 计划为奶牛们新开办一所大学!

有 N 头奶牛可能会入学。

每头奶牛最多愿意支付 ci 的学费。

Farmer John 可以设定所有奶牛入学需要支付的学费。

如果这笔学费大于一头奶牛愿意支付的最高金额,那么这头奶牛就不会入学。

Farmer John 想赚尽可能多的钱,从而可以给他的讲师提供一笔可观的工资。

请求出他能赚到的钱的数量,以及此时应当收取多少学费。

输入格式
输入的第一行包含 N。

第二行包含 N 个整数 c1,c2,…,cN,其中 ci 是奶牛 i 愿意支付的最高学费金额。

输出格式
输出 Farmer John 可以赚到的最大金额以及最优情况下他应该收取的学费。如果有多个解,输出收取学费最小的解。

注意这个问题涉及到的整数可能需要使用 64 位整数型(例如,Java 中的 “long”,C/C++ 中的 “long long”)。

数据范围
1≤N≤105,
1≤ci≤106

输入样例:
4
1 6 4 6
输出样例:
12 4
样例解释
如果 Farmer John 收费 4,那么 3 头奶牛将会入学,从而使他赚取 3×4=12 的金额。

自己的想法:

  • 一开始想的肯定是先把所有的数据存在一个地方,然后利用查找,同时把总的最大学费和最小的支付金额
  • 这个题是离散的取值,所以想到利用散列表来存储
  • 从后往前枚举每一个愿意交的学费
  • 找到某一个学费,使得当前学费所得到的入学牛的数量✖当前学费的总数最大

自己的一开始的代码(TLE):

#include<iostream>
#include<map>
using namespace std;

map<int,int> m;

int main(){
	int n, c, maxc = 0, minc = 0x7fffffff, min_single_tuition;
	long long max_total_tuition = 0;
	cin >> n;
	for(int i = 0; i < n; i++){
		cin >> c;
		m[c]++;
		if(maxc < c) maxc = c;
		if(minc > c) minc = c;
	}	
	for(int i = maxc; i >= minc; i--){
		if(m[i] != 0){
//			cout << "i = " << i << " m[i] = " << m[i] << endl;
			int total_tuition = 0;
			for(int j = i; j <= maxc; j++){
				total_tuition += i*m[j];
			}
			if(total_tuition >= max_total_tuition){
				max_total_tuition = total_tuition;
				min_single_tuition = i;
			}
		}
	}
	
	cout << max_total_tuition << " " << min_single_tuition;
	
	return 0;
}

y总的思路(最优化):

  • 利用数据范围猜数据复杂度,时间复杂度需要控制在需要在O(n2)以下
  • 将所有牛按照愿意付的金额从小到大排序,那么在线段上就会产生多个点
  • 根据题意,一定存在一个点,使得学费总额达到最大,而在这个点之前的牛都不符合要求
  • 由于每一个愿意支付的金额的点是离散的,所以在两个点之间可能存在无数条符合条件的点符合学费的要求
  • 我们要是的收取的学费降到最低,由于在边界上的点是纳入计算的,所以就要选择最右边的点
  • 排序好之后,从前往后枚举
  • 当枚举到的当前的点使得总学费金额大于前面的最大值,则更新标记
  • 当出现两个相等的总学费时,选择更低的,所以判断时需要抛弃等号

在这里插入图片描述

假设我们找到的这条线是r,那么收到的总学费应该是r ✖ 这条线右边的牛的数量

y总的代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 100010;

int n;
int w[N];

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &w[i]);

    sort(w, w + n);

    LL rtot = 0, rfee = 0;
    for (int i = 0; i < n; i ++ )
    {
        LL tot = (LL)w[i] * (n - i);
        if (tot > rtot)
        {
            rtot = tot;
            rfee = w[i];
        }
    }

    printf("%lld %lld\n", rtot, rfee);
    return 0;
}

//作者:yxc
//链接:https://www.acwing.com/activity/content/code/content/5046735/
//来源:AcWing
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

根据他的思路我找到了自己的问题:

  • 用map比自己写的算法慢了接近一倍,每一次的插入和查找也是需要占用时间复杂度的
  • 放弃了查找-计算的思想,只需存储和利用每一头牛愿意支付的最低学费,枚举每一个学费

自己改进的代码:

#include<iostream>
#include <algorithm>
using namespace std;

typedef long long ll;
const int N = 1e5+10;

int main(){
	int n, c[N];
	ll max_total_tuition = 0, min_single_tuition = 0x7fffffffffffffff;
	cin >> n;
	for(int i = 0; i < n; i++) cin >> c[i];
	sort(c, c+n);
	
	for(int i = 0; i < n; i++){
		ll total = (ll)c[i]*(n-i);
		if(total > max_total_tuition){
			max_total_tuition = total;
			min_single_tuition = c[i];
		}
	}
	
	cout << max_total_tuition << " " << min_single_tuition;
	
	return 0;
}

如果用y总的代码,运行时间为256ms
我改进的代码因为用的cin和cout,需要输入输出流,所以运行时间稍微长一点,需要392ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ New和Delete

目录 前言 New Delete 前言 new是c中用于动态申请空间的运算符&#xff0c;malloc也是用于动态申请空间的&#xff0c;但malloc是函数。 New new是用来开辟一段新空间的&#xff0c;和一般申明不同的是&#xff0c;new开辟的新空间是在堆上&#xff0c;而申明的变量是在栈上…

【自学Java】Java注释

Java注释 Java注释教程 用于注解说明解释程序的文字就是注释&#xff0c;注释可以提高代码的阅读性。同时&#xff0c;注释也是一个程序员必须要具有的良好的编程习惯。我们首先应该将自己的思想通过注释先整理出来&#xff0c;再用代码实现。 在 Java 语言 中&#xff0c;一…

(二)Qt多线程实现海康工业相机图像实时采集

系列文章目录 提示&#xff1a;这里是该系列文章的所有文章的目录 第一章&#xff1a; &#xff08;一&#xff09;QtOpenCV调用海康工业相机SDK示例开发 第二章&#xff1a; &#xff08;二&#xff09;Qt多线程实现海康工业相机图像实时采集 文章目录系列文章目录前言一、项目…

C语言中指针常见问题集

1. 我想声明一个指针并为它分配一些空间,但却不行。这些代码有什么问题&#xff1f; char *p; *p malloc(10);答&#xff1a;你所声明的指针是p, 而不是*p, 当你操作指针本身时你只需要使用指针的名字即可:cp malloc(10);当你操作指针指向的内存时,你才需要使用*作为间接操…

坚果的2022年终总结

人生天地之间&#xff0c;若白驹过隙&#xff0c;转眼间&#xff0c;这一年又快要过去了&#xff0c;按照惯例还是写一篇年终总结&#xff0c;同时也看一下自己是否又成长&#xff0c;是否有哪些事情没做好&#xff0c;给自己做一个复盘。一、缘起OpenHarmony我是从去年开始参加…

Webpack 钩子介绍、手写 Webpack Plugin

目录 1. Plugin 用作和工作原理 1.1 Plugin 的作用 1.2 Plugin 的工作原理 2. Webpack 底层逻辑和钩子介绍 2.1 Webpack 内部执行流程 2.2 Webpack 内部钩子 2.2.1 钩子是什么 2.2.2 Tapable —— 为 Webpack 提供 Plugin 钩子 数据类型接口 定义 2.2.3 Compiler Hook…

C#,图像二值化(08)——灰度图像二值化,全局算法,全局阈值优化算法及其源代码

1、全局阈值算法 基于灰度直方图的优化迭代算法之一。 Iterative Scheduler and Modified Iterative Water-Filling In the downlink, the inter-cell interference is only function of the power levels and is independent of the user scheduling decisions. This suggest…

俺的2022年

年末将至&#xff0c;还是要写点总结性的内容&#xff0c;以回顾过去一年做的各种事情。工作之外从客观数据上看&#xff0c;今年的收入水平略差于去年&#xff0c;主要是工作外的收入有所减少&#xff0c;其核心原因是没有录制新的课程内容进行变现&#xff0c;原本的计划是&a…

【自学Python】Python介绍

Python教程 什么是编程语言 编程语言&#xff08;programming language&#xff09;&#xff0c;是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧&#xff0c;用来向计算机发出指令。 也可以说&#xff0c;计算机语言让程序员能够准确地定义计算机所需要使用的…

拓展交流空间,分享开发精彩 | 开发者说·DTalk 鉴赏

日月其迈&#xff0c;岁律更新&#xff0c;时间的洗礼让开发者们更加坚韧&#xff0c;持续探索&#xff0c;不断追求&#xff0c;同样也激励着我们为开发者提供更多的帮助与支持。不断迭代的技术产品是开发者们的趁手工具&#xff0c;定期更新的政策助力打造安全可靠的生态&…

基础数学(4)——线性回归复习

文章目录课程回顾基础知识回归模型的建模过程一元线性回归模型线性回顾进行极大似然估计&#xff08;例题&#xff08;必考&#xff09;&#xff09;极大似然估计极大似然估计的性质线性性无偏性最优性&#xff08;记住即可&#xff0c;没有推导&#xff09;方差计算一元线性回…

智能制造 | AIRIOT智慧工厂管理解决方案

工厂生产运转中&#xff0c;设备数量多&#xff0c;环境复杂、企业往往需要承担很高的维修、保养、备件和人力成本。传统的工厂改革遇到了诸多前所未有的挑战&#xff1a; 1、管理系统较多&#xff0c;数据隔离&#xff0c;系统集成困难重重&#xff1b; 2、大量老旧设备无法联…

QT使用log4cpp日志库

文章目录QT使用log4cpp日志库1. 从官网下载log4cpp源码2. 编译项目3. 在QT中使用log4cpp4. log4cpp4.1. Category4.2. Appender4.3. Layout4.4. Priority4.5. 使用宏定义为日志加上文件名 函数名 行号等QT使用log4cpp日志库 1. 从官网下载log4cpp源码 log4cpp官方网址 下载后…

MyBatisPlus ---- 常用注解

MyBatisPlus ---- 常用注解1. TableNamea>问题b>通过TableName解决问题c>通过全局配置解决问题2. Tablelda>问题b>通过TableId解决问题c>TableId的value属性d>TableId的type属性e>雪花算法3. TableFielda>情况1b>情况24. TableLogica>逻辑删除…

LeetCodeday03

203.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1…

基于springboot+mybatis+mysql+html实现医院预约挂号管理系统

基于springbootmybatismysqlhtml实现医院预约挂号管理系统一、系统简介二、系统主要功能界面2.1登陆2.2首页&#xff08;留言板、我的预约&#xff09;--用户2.3就诊预约--用户2.4我的预约--用户2.5我参与的评介--用户2.6我的预约日程--医生2.7对我的评介--医生2.8医生管理--管…

一文探索“预训练”的奥秘!

Datawhale干货 作者&#xff1a;王奥迪&#xff0c;单位&#xff1a;中国移动云能力中心2022年下半年开始&#xff0c;涌现出一大批“大模型”的优秀应用&#xff0c;其中比较出圈的当属AI作画与ChatGPT&#xff0c;刷爆了各类社交平台&#xff0c;其让人惊艳的效果&#xff0c…

[思维模式-19]:《复盘》-7- “积”篇 - 操作复盘- 如何做好复盘

目录 一、联想&#xff1a;复盘的五个误区与七个关键成功要素 1.1 五个误区 1.2 七个关键成功要素 二、复盘的25个“坑”及对策建议 2.1 回顾、评估阶段 2.2 分析、反思阶段 2.3 萃取、提炼阶段 2.4 转化、应用阶段 2.5 复盘引导阶段 三、有效复盘的三项核心技能 3.…

java常见问题处理

文章目录一、前言二、实战演练1、idea常用快捷键使用2、idea设置字体大小3、idea设置背景颜色-背景4、idea配置Maven5、idea中配置JDK6、idea中java.util变红报错IDEA中Sources、JavaDocs路径是红色的7、idea中使用mybatisPlus 自增主键失效&#xff0c;自增主键超大小知识点8、…

ZI-data RO-data RW-data Code BSS DATA

KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释&#xff08;转&#xff09; - 酒醉的Tiger - 博客园源&#xff1a;KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释KEIL RVMDK编译后的信息Program Size: Code86496 RO-datahttps://ww…