首页 > 其他分享 >P2234 [HNOI2002] 营业额统计

P2234 [HNOI2002] 营业额统计

时间:2023-11-21 23:13:58浏览次数:29  
标签:pre 营业额 include int rank 链表 HNOI2002 排序 P2234

P2234 [HNOI2002] 营业额统计

题解思路

  1. 对原数组排序,记录下排序前的位置。
  2. 对排序后的数组构造链表。
  3. 从原数组的 \(n\) 往 \(1\) 枚举,比较排序生成链表中该元素的前驱或后继与该元素差值的最小值,加入答案。
  4. 在排序生成的链表中删除该元素。

正确性的疑惑

  • 一开始很困惑,难道排序链表的该元素的前驱与后继能一定符合题目“该天以前某一天”的要求,都保证天数在该元素之前吗?
  • 从原数组的 \(n\) 往 \(1\) 枚举,解决了该问题。
    • 第一个操作的是 \(n\) ,即最后的天数,那么其他所有数都在该天数之前,都符合
    • 操作完之后删除了 \(n\) , 操作 \(n - 1\),显然剩下的元素也都在该天数之前。

代码实现

实现上体现了手写链表的好处。

如果用STL实现就挺麻烦。

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

using namespace std;

struct node
{
	int pre = 0, nxt = 0;
} b[33000];

struct data
{
	int d, rank;
	bool operator < (const data &rhs)
	{
		return (d < rhs.d) || (d == rhs.d && rank < rhs.rank);
	}
} a[33000];

void del(int x)
{
	b[b[x].pre].nxt = b[x].nxt;
	b[b[x].nxt].pre = b[x].pre;
}

int r[33000], n, ans;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i].d;
		a[i].rank = i;
	}
	sort(a + 1, a + n + 1);
	for (int i = 1; i <= n; i++)
	{
		r[a[i].rank] = i;
		b[i].pre = i - 1;
		b[i].nxt = (i == n) ? 0 : (i + 1);
	}
	for (int i = n; i; i--)
	{
		int x = r[i];
		int j, k;
		if (b[x].pre)
			j = abs(a[b[x].pre].d - a[x].d);
		else
			j = 0x7fffffff;
		if (b[x].nxt)
			k = abs(a[b[x].nxt].d - a[x].d);
		else
			k = 0x7fffffff;
		if (i != 1)
			ans += min(j, k);
		else
			ans += a[x].d;
		del(x);
		r[i] = 0;
	}
	cout << ans;
	return 0;
}

标签:pre,营业额,include,int,rank,链表,HNOI2002,排序,P2234
From: https://www.cnblogs.com/kdlyh/p/17847849.html

相关文章

  • P2234
    乐死我了,一道需要用平衡树的算法的题,在我忘了看标签的情况下下意识用了一个普及-难度的超简单思路解决了。当然其中加入了一些半骗分半贪心性质的剪枝。总之这破算法竟然AC了就离谱,乐死我了Code#include<iostream>#include<cmath>usingnamespacestd;intb[2000005];int......
  • 营业额统计_代码开发
            ......
  • 题解 P2229 【[HNOI2002]沙漠寻宝】
    postedon2021-06-0112:15:15|under题解|source这题一看就知道是个模拟。做模拟题的时候,一定要先确保你的程序能跑出正确的结果,再去想优化时间。这道题还是很简单的,让我们开始吧:读入我们把输入离线,拿string存起来。如果不离线,那loop就会很难处理,加大难度。intn;......
  • 题解 P2276 [HNOI2002]农场的果树
    首先可以观察出一颗\(n\)个节点的二叉树,当其字典序最小的时候,其形态为一条向右偏的链,当其字典序最大的时候,是一条向左偏的链。由于每一种编码对应唯一的一颗二叉树,我们可以先建树。然后考虑树上分治,尝试以下三种方式:变大右子树的字典序变大左子树的字典序,并将右子树变成......
  • 1321. 餐馆营业额变化增长
    1321.餐馆营业额变化增长SQL架构表:Customer+---------------+---------+|ColumnName|Type|+---------------+---------+|customer_id|int||name|varchar||visited_on|date||amount|int|+-------------......
  • Python+pandas使用交叉表分析超市营业额数据
    交叉表是一种特殊的透视表,往往用来统计频次,也可以使用参数aggfunc指定聚合函数实现其他功能。扩展库pandas提供了crosstab()函数用来生成交叉表,返回新的DataFrame,其语法为:crosstab(index,columns,values=None,rownames=None,colnames=None,aggfunc=None,margins=False,dropn......
  • 1321. 餐馆营业额变化增长
    【题目】表:Customer+---------------+---------+|ColumnName  |Type   |+---------------+---------+|customer_id  |int    ||name         |varchar||visited_on   |date   ||amount       |int    |+-----------......
  • HYSBZ 1588 营业额统计
    Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了......
  • 经营鲜花店铺要使用的窍门,让店铺营业额激增
     好不容易地开了一家自己的鲜花店之后,接下来就要面对如何经营鲜花店铺的问题,解决这个问题才能实现开店盈利。为此我们在开店时要使用一些窍门。下面铺先生为大家介绍经营......
  • luogu P2233 [HNOI2002]公交车路线
    [HNOI2002]公交车路线题目描述在长沙城新建的环城公路上一共有\(8\)个公交站,分别为A、B、C、D、E、F、G、H。公共汽车只能够在相邻的两个公交站之间运行,因此你从某一......