cf536b——优先队列的运用
题目
题目:cf536 B题
题目大意:一个饭店有n种食物,每种食物有对应的价格和数量,然后有m个顾客,每个顾客需要$d_j$份第$t_j$种食物,如果该种食物数量不够,则选其它尽可能便宜的代替(出现同样价格的应选索引最小的);如果所有的食物都不够该顾客,该顾客会吃完这些食物,并且不花钱。假设只有当前一个顾客服务完下一个才会来。
思路
模拟,根据题目所说的去做即可。唯一的困难是得到最便宜的食物,这需要对食物进行排序,由于同时还要记录原来的索引,所以用pair存储,放在优先队列中。
时间复杂度:$\mathcal{O}(m + n \log n)$
代码
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; typedef long long LL;
typedef pair<int,int> PII; const int maxn = + ;
int n, m,r[maxn],c[maxn];
priority_queue<PII, vector<PII>, greater<PII>>Q; //优先第一维比较,第一维相同则根据第二维 int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) scanf("%d", &r[i]);
for (int i = ; i <= n; i++)
{
scanf("%d", &c[i]);
Q.push(PII(c[i], i));
}
for (int i = ; i <= m; i++)
{
int t, d;
scanf("%d%d", &t, &d);
if (d <= r[t])
{
r[t] -= d;
printf("%lld\n", 1LL * d * c[t]);
}
else
{
bool flag = false;
LL ans = 1LL * r[t] * c[t];
d -= r[t];
r[t] = ;
while (!Q.empty())
{
while (!Q.empty() && r[Q.top().second] == ) Q.pop();
if (Q.empty()) break;
PII now = Q.top();
if (d <= r[now.second])
{
r[now.second] -= d;
ans += 1LL * d * now.first;
flag = true;
printf("%lld\n", ans);
break;
}
else
{
ans += 1LL * r[now.second] * now.first;
d -= r[now.second];
r[now.second] = ;
Q.pop();
}
}
if (!flag) printf("0\n");
}
}
return ;
}
参考链接:https://codeforces.com/blog/entry/64928
cf536b——优先队列的运用的更多相关文章
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 数据结构:优先队列 基于list实现(python版)
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Minion-Xu #list实现优先队列 class ListPriQueueValueE ...
- python优先队列,队列和栈
打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) ...
- 数据结构作业——Sanji(优先队列)
山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...
- Java优先队列
按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...
- 优先队列实现Huffman编码
首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...
- “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)
题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...
- Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
/* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...
- 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)
ギリギリ eye Description A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...
随机推荐
- Ubuntu 12.10终端Terminal快捷方式调用
1:使用快捷键:ctrl+alt+t 打开终端 2:在终端上右键,选“Lock to launcher” 这样就锁定在左侧了,需要用时,直接点就打开了.
- 稳定婚姻(tarjan)
传送门 这道题一开始可能以为是二分图匹配……?不过后来发现和二分图没啥大关系. 简单分析之后发现,把夫妻之间连边(男性向女性连边),之后再将每对曾经是情侣的人连边(女性向男性连边),当然以上的方向可以 ...
- EF 6.0 The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value. c#中的时间
在SQL server 中,有两种日期时间类型: 1.DateTime 它的范围是 1753-1-1 至 9999-12-31 2.DateTime2 它的满园是 0001-01-01 至 9999- ...
- (转)C#中数组、ArrayList和List三者的区别
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/8657431 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到 ...
- Ruby Numeric类
Numeric类 Numeric ---------> Integer ---------> Fixnum ...
- HDU2604:Queuing(矩阵快速幂+递推)
传送门 题意 长为len的字符串只由'f','m'构成,有2^len种情况,问在其中不包含'fmf','fff'的字符串有多少个,此处将队列换成字符串 分析 矩阵快速幂写的比较崩,手生了,多练! 用f ...
- [App Store Connect帮助]七、在 App Store 上发行(3.4)提交至“App 审核”:将构建版本从审核中移除
若要停止“App 审核”流程,您可以将该 App 版本从 App 审核中移除.要执行此项操作,App 状态必须为下列之一: 正在等待出口合规检查 正在等待审核 正在审核 等待开发者发布 等待 Appl ...
- 组合数学练习题(一)——Chemist
题意: 从 n 个人中选出不超过 k 个人,再在选出的人中选出一些人成为队员,再在队员中选一名队长,求不同的方案数.答案 mod 8388608. 共有T组询问,每次给你n和k.T ≤ 10^4 k ...
- 浅谈Windows API编程
WinSDK是编程中的传统难点,个人写的WinAPI程序也不少了,其实之所以难就难在每个调用的API都包含着Windows这个操作系统的潜规则或者是windows内部的运行机制…… WinSDK是编程 ...
- javascript监听值变化
最近面了有道前端实习,人品爆发一面过了.但是在一面中面试官问了一个问题”MVC用javascript如何实现?如果实现双向绑定?值变化监听?“ 当时我回答”js好像没函数进行值变化监听“ 后来想想很不 ...