首页 > 其他分享 >超市-并查集应用

超市-并查集应用

时间:2023-07-27 18:11:07浏览次数:26  
标签:int 查集 超市 商品 日期 应用 最晚 过期 输入

【超市】

【问题描述】

超市里有N件商品,每个商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品(即当天di<=0)不能再卖。求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。

【输入格式】

输入包含多组测试用例,测试用例最多30组。
每组测试用例,以输入整数N开始,接下里输入N对pi和di,分别代表第i件商品的利润和过期时间。
在输入中,数据之间可以自由穿插任意个空格或空行,输入至文件结尾时终止输入,保证数据正确。

【输出格式】

对于每组产品,输出一个该组的最大收益值。每个结果占一行。
【样例输入】
4 50 2 10 1 20 2 30 1
7 3 1 2 1 10 3 100 2 8 2 1 20 50 10

【样例输出】

80
169

数据范围

0≤N≤10000,1≤pi,di≤10000

分析:

每天只能卖一件,过期不能卖。我们的任务是合理规划商品的卖出日期,使得收益最大。

贪心:按利润大小顺序,规划卖出时间,尽可能晚点卖,这样可能会给保质期短的商品留有更多选择机会。

先将商品按利润从大到小排序,然后按顺序规划卖出日期。卖出时间为,可以卖出的日期中的最晚的那一天。

设:排序后第i件商品的利润是 a[i].p,过期天数是a[i].d。

计算第I号商品可以最晚卖出的日期,从过期天数a[i].d 往前查,排除那些已经卖过商品的日期后的最晚的那一天。

直接模拟会超时。怎样更快找到最晚可卖日期?并查集。

不断往前找的过程,很像并查集中不断向上找祖宗的过程。

起初我们把所有日期抽象为一个集合,集合的祖宗(也可以说是集合的代表元素) 。

我们把最晚售卖日期当成把每个集合的祖宗,同时安排个0天的集合,这个集合的祖宗是0,若是有某个商品查到的祖宗是0,表示它这个商品已经没法卖了。

并查集中并的部分:

当某个商品的保质期是d,我们计算出的最晚售卖时间是x,那么我们就将x,x-1 所在集合合并。

含义是,下一次再有保质期是d的商品出现时,它的最晚售卖时间最大可能是x-1,当然x-1 那一天可能也卖过商品了,那它最晚售卖时间就是x-2了。

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 10005;
 4 int n, ans;
 5 int f[N];
 6 struct node {
 7     int t, val;
 8 } a[N];
 9 bool cmp(const node &x, const node &y) { return x.val > y.val; }
10 int find(int x) {
11     if (f[x] < 0)
12         return x;
13     return f[x] = find(f[x]);
14 }
15 int main() {
16     while (cin >> n) {
17         ans = 0;
18         memset(f, -1, sizeof(f));
19         for (int i = 1; i <= n; i++) scanf("%d%d", &a[i].val, &a[i].t);
20         sort(a + 1, a + 1 + n, cmp);
21         for (int i = 1; i <= n; i++) {
22             int r1 = find(a[i].t);
23             if (r1 > 0)
24                 ans += a[i].val, f[r1] = r1 - 1;
25         }
26         printf("%d\n", ans);
27     }
28     return 0;
29 }

 

 

 

 

 

标签:int,查集,超市,商品,日期,应用,最晚,过期,输入
From: https://www.cnblogs.com/flatte/p/17585516.html

相关文章

  • AIRIOT可视化组态引擎如何应用于物联业务场景中
    在物联网的业务应用场景中,可视化组态是一个必不可少的功能需求。不同的行业场景,都需要将物联设备采集的数据和业务场景状态进行直观的可视化展示,供使用者进行分析或决策。如工艺流程用能监测、3D场景构建、能耗趋势场景报警联动、重点设备视频接入、重点数据移动监测、计划用能终......
  • 5G智慧杆如何助力打造智慧市政应用
    5G技术在智慧市政建设方面具有广泛的应用场景,通过提供高速、低延迟和大容量的网络连接,满足各种智能设备和物联网系统之间的通信、感知、控制、联动。而智慧路灯杆作为具有强大感知能力、具备多种服务功能的智能物联网终端系统,如何协同5G技术打造智慧市政应用呢?本篇就简单介绍一下5......
  • Profinet转EtherNet/IP网关连接AB PLC的应用案例
    西门子S7-1500PLC(profinet)与ABPLC以太网通讯(EtherNet/IP)。本文主要介绍捷米特JM-EIP-PN的Profinet转EtherNet/IP网关,连接西门子S7-1500PLC与ABPLC 通讯的配置过程,供大家参考。1, 新建工程:运行 RSLogix5000 程序,选择菜单 File->New,弹出对话框:  2, 在“Type”中选......
  • 浅谈API安全的应用
    ​理论基础 API它的全称是ApplicationProgrammingInterface,也叫做应用程序接口,它定义了软件之间的数据交互方式、功能类型。随着互联网的普及和发展,API从早期的软件内部调用的接口,扩展到互联网上对外提供服务的接口。调用者通过调用API,可以获取接口提供的各项服务,而无须访......
  • 并查集-讲课内容补全(未完
    施工中......先在这里给出我的并查集模板以下为比较常用的路径压缩intf[MAXN],n,m;voidclean(){for(inti=1;i<=n;i++)f[i]=i;}intfind(intx){if(x!=f[x])f[x]=find(f[x]);returnf[x];}voidadd(intx,inty){intfx=find(x),fy=find(y......
  • The Third Letter带权并查集
    Problem-1850H-Codeforces题意是给你a,b,c说明a在b后面c个单位(c<0就是在左边),每个位置只能有一个数,一共有n个位置,告诉你m个关系,问是否符合条件我们可以设置d[x]表示x到它的最早的父节点的距离,然后如果两个数父节点一样,那么c!=d[a]-d[b]时就说明不符合条件那么对于并查......
  • 安全门继电器的应用原理
    一、基本介绍1.由来2.关键词急停、安全门锁、门磁、手动准备按钮3.电气符号KS14.原理:由硬件和电路组合。市面上常用皮尔磁安全继电器,由两对通道,三对触点,一对复位构成。其工作条件:两对通道(理解为一个继电器内有两对串联的线圈)必须同时且持续接通,按下复位按钮后,其三对触点就......
  • Dokcer学习之旅(2)——Dockerfile基础应用
    什么是Dockerfile?从dockercommit的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就......
  • 第六章应用层
    1.应用层概述应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分。早期基于文本的应用(电子邮件、远程登录、文件传输、新闻组)20世纪90年代将因特网带入千家万户的万维网www当今流行的即时通信、P2P文件共享及各种音......
  • Django框架的学习,主要文件介绍,应用,小白必会三板斧
    今日内容详细MySQL数据库、前端我们之前学习了数据库、前端、Python基础等三大部分,但是,他们三块的内容没有串在一起,也就没办法开发出一个完成的web项目出来,因此,我们通过Django框架把这三者融合在一起,以后我们就可以很方便的开发出各种各样的项目.web应用的简介"""是因为Dja......