分类
标签
2-SAT AC自动机 BFS CDQ dfs DP fail树 FFT FFT&NTT FWT hash KD-Tree KMP LCA SPFA STL Tarjan Treap Trie 主席树 乱搞 二分 二分图匹配 二分答案 二维SPFA 交互 位运算 其他 最小生成树 分块 区间DP 半平面交 博弈论 可持久化 可持久化Trie树 后缀数组 图库 平衡树 并查集 插头DP 数学 数论 无旋Treap 日记 暴力 权值树状数组 栈 树DP 树套树 树状数组 树贪心 概率DP 模拟 欧拉定理 点分治 状压DP 生成函数 矩阵乘 线性规划 线段树 组合 网络流 群论 莫比乌斯反演 计算几何 贪心 费用流 高斯消元
558 字
3 分钟
COGS 2235 烤鸡翅
【题目描述】
在焦作太行路上,有一家烤鸡翅的生意火爆。因为好吃,所以卖的特别好。排队的人就特别多,经常有很多人买不到鸡翅。 鸡翅会在每分钟烤出Xi个,每分钟也只会卖给一个客人,第i个客人需要买Yi个。因为生意火爆,老板可以选择在这分钟不卖给这个客人鸡翅,或者卖给这个顾客他需要的鸡翅, 如果现在剩余的鸡翅不够,那就肯定不能卖给这个客人。无论这个客人能否买到鸡翅,他必须离开队伍。 现在给定N分钟,且已经知道每分钟烤出的鸡翅个数Xi,也知道每个客人需要鸡翅的Yi个数,现在老板想知道,如何合理安排卖给与拒绝,最多可以满足多少人
【输入格式】
第一行一个正整数N,表示有N分钟的时间卖鸡翅 第二行N个用空格隔开的整数 X1,X2……Xn,Xi表示第i分钟会有Xi个鸡翅烤出 第三行N个用空格隔开的整数Y1,Y2……Yn,Yi表示第i分钟的顾客需要Yi个鸡翅
【输出格式】
一个整数,表示最多可以满足买到鸡翅的人数。
【样例输入】
6
2 2 1 2 1 0
1 2 2 3 4 4
【样例输出】
3
【数据范围】
50% 数据保证 N<=1000 100% 1<=N<=250000 Xi,Yi都在[0,10^9]范围内
题解
能卖就卖
卖不了了如何以前有人买的数目比他多
那就不卖给以前的那个人了也就是收回来
可后悔的贪心,长见识了。 主要使用优先队列
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int x[250005], y[250005];
class comp
{
public:
bool operator()(long long a, long long b)
{
return y[a] < y[b];
}
};
priority_queue<long long, vector<long long>, comp> Q;
int main()
{
freopen("wing.in", "r", stdin);
freopen("wing.out", "w", stdout);
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &x[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &y[i]);
long long sum = 0;
for (int i = 1; i <= n; i++)
{
sum += x[i];
if (sum >= y[i])
sum -= y[i], Q.push(i);
else
{
if (!Q.empty())
{
if (y[Q.top()] > y[i])
{
sum += y[Q.top()];
Q.pop();
sum -= y[i];
Q.push(i);
}
}
}
}
printf("%d\n", Q.size());
}