首页 > 编程语言 >题解 HZOJ 284 超市卖货 C/C++

题解 HZOJ 284 超市卖货 C/C++

时间:2024-09-27 21:48:28浏览次数:3  
标签:arr int 题解 MaxHeap pos C++ arrSize HZOJ data

题目传送门:

超市卖货 - 题目 - Online Judge (haizeix.com)icon-default.png?t=O83Ahttps://oj.haizeix.com/problem/284思路:

每次寻找价格最高的商品,并尝试卖掉它:

寻找未卖出商品的日期,优先锁定其保质期最后一天,若该日期已卖出则继续向前寻找

能找到未卖出商品的日期时,收入增加,标记该日期

代码实现:

为了方便地找到价格最高的商品,我们先对商品价格连带其保质期进行排序

为实现该过程,我采用线性建堆+堆排序

其他排序也行,10000 排序一轮就算再低效的排序算法也不会超时吧

就是注意在交换价格的同时还要交换保质期

代码:

#include <stdio.h>
void swap(int* a, int* b)
{
	int c = *a;
	*a = *b;
	*b = c;
}
void MaxHeap_downAdjust(int* data, int pos, int count, int* d)
{
	while (pos * 2 <= count)
	{
		int max;
		if (pos * 2 + 1 > count) max = pos * 2;
		else max = pos * 2 + (data[pos * 2] > data[pos * 2 + 1] ? 0 : 1);
		if (data[pos] >= data[max]) break;
		swap(&data[pos], &data[max]);
		swap(&d[pos], &d[max]);
		pos = max;
	}
}
void MaxHeap_build(int* arr, int arrSize, int* d)
{
	int i;
	for (i = arrSize / 2; i >= 1; i--) MaxHeap_downAdjust(arr - 1, i, arrSize, d - 1);
}
void MaxHeap_sort(int* arr, int arrSize, int* d)
{
	MaxHeap_build(arr, arrSize, d);
	int i;
	for (i = arrSize - 1; i >= 1; i--) swap(&arr[0], &arr[i]), swap(&d[0], &d[i]), MaxHeap_downAdjust(arr - 1, 1, i, d - 1);
}
int main()
{
	int n, d[10001] = { 0 }, p[10001] = { 0 }, i, day[10001] = { 0 }, money = 0, j;
	scanf("%d", &n);//day=0表示该天未售出,=1表示已售出
	for (i = 0; i < n; i++) scanf("%d%d", &p[i], &d[i]);
	MaxHeap_sort(p, n, d);
	for (i = n - 1; i >= 0; i--) for (j = d[i] - 1; j >= 0; j--) if (!day[j]) { money += p[i]; day[j] = 1; break; }
	printf("%d", money);
	return 0;
}

标签:arr,int,题解,MaxHeap,pos,C++,arrSize,HZOJ,data
From: https://blog.csdn.net/qwq_ovo_pwp/article/details/142441268

相关文章

  • Echarts图表知识点汇总及请求django服务器后端跨域问题解决
    1.引入echartsvue3中通过npm引入:npminstallecharts--saveimport*asechartsfrom'echarts';//基于准备好的dom,初始化echarts实例varmyChart=echarts.init(document.getElementById('main'));//绘制图表myChart.setOption({title:{text:'ECha......
  • P9019 [USACO23JAN] Tractor Paths P 题解
    P9019[USACO23JAN]TractorPathsP题解难度其实绝对不止蓝题。先考虑第一问。维护任意两点之间的最短路是困难的,难以dp或是采取其它方法解决。难以算最短路就转换思路,考虑从\(x\)走\(p\)步能走到哪。考虑到这个东西是有单调性的,也就是说对于\(x<y<z\),从\(x\)能走到......
  • C++引用的基本概念,引用的定义与使用
    C++中的引用(Reference)是一种复合类型,它是某个已存在变量的别名(alias)。换句话说,引用在内部存储了另一个变量的地址,但是与指针不同的是,引用在定义时必须被初始化,并且一旦被初始化后,它就不能再被改变为引用另一个变量(即引用一旦绑定到一个变量,就不能再被绑定到另一个变量)。此外,引......
  • C++字符串与字符数组
    在C++中,字符串和字符数组是紧密相关的概念,但它们之间也存在一些关键的区别。理解这些区别对于编写高效、安全的C++代码非常重要。字符数组字符数组是C++中用于存储字符序列的基础数据结构。它本质上是一个元素类型为char的数组,可以在声明时初始化,也可以在运行时通过赋值或函......
  • Codeforces Round 944 (Div. 4) A~G题解
    A\(min\)函数和\(max\)函数的使用,按照格式输出即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;voidsolve(){intx,y;cin>>x>>y;cout<<min(x,y)<<'......
  • Codeforces Round 973题解(E)
    E.PrefixGCD假设我们从一个空集合\(b\)开始,不断从\(a\)数组中选择一个元素添加到\(b\)集合的尾部,当把\(a\)数组的元素全部添加到\(b\)中后,得到的\(b\)即为所求的rearrange后的\(a\)。结论1:每次选择使得其和当前\(b\)中所有元素的最大公约数最小的那个\(a_i\)加入到\(b\)的末......
  • C++线程同步之条件变量
    条件变量需要和互斥量配合起来使用,C++11提供了两种条件变量:condition_variable:需要配合std::unique_lockstd::mutex进行wait操作,也就是阻塞线程的操作。condition_variable_any:可以和任意带有lock()、unlock()语义的mutex搭配使用,也就是说有四种:std::mutex:独占的非递归互斥锁......
  • ZZJC新生训练赛第一场题解
    先给出比赛链接:https://ac.nowcoder.com/acm/contest/91452下面说一下难度分层:(同一难度下按字典序排序)Easy(简单):B,FMedium(中等):A,E,HHard(困难):C,GAnti-AK(防AK):D,Icin.tie(nullptr)->sync_with_stdio(false);//加速输入输出的A游游的整数翻转将所......
  • 【洛谷】P4819 [中山市选] 杀人游戏 的题解
    【洛谷】P4819[中山市选]杀人游戏的题解题目传送门题解Tarjan我可爱的Tarjan嘻嘻qaq枚举每一个点,然后枚举每条出边,如果相连的两个点在同一个强连通分量中,或者xx......
  • 【洛谷】AT_abc178_d [ABC178D] Redistribution 的题解
    【洛谷】AT_abc178_d[ABC178D]Redistribution的题解洛谷传送门AT传送门题解一个水水的动态规划,阿巴巴巴。题目大概是这样:给定一个正整数SSS,问有多少个数满足以......