Codeforces: B. Shopping 题解(AC_Yee)

文章描述了一个关于算法的问题,其中涉及k件商品,n个顾客和m个购买需求。每个顾客查找商品时会按顺序检查货架,找到商品后会将其移至货架前端。作者提出了使用双向队列和栈的数据结构来模拟此过程,并给出了C++实现代码,寻求更优解法或对现有代码的反馈。
摘要由CSDN通过智能技术生成

Problem - B - Codeforces

本题的意思是你有k件商品,有n个顾客会来买,每个顾客会买m个商品。

题意让我们求这n个顾客会总共花费多长的时间。

        卖家:你的k件商品会以一定的初始顺序放在你的货架上,你的客户会从这个货架中按照现在货架上的摆放顺序从头到尾地查看这件商品是不是他现在想买的,如果购买的商品不是第一件产品,刚刚购买的产品会放在第一件产品的位置,剩下的商品的位置会依次让位。

        这意味着k个商品总数不会改变,但货架的商品摆放顺序会改变。

        买家:每查看一次商品就要花费一个单位的时间,会从货架上第一个商品的顺序一次找下去,题意让我们求这n个顾客会总共花费多长的时间。

        我的想法是用一个双向队列去充当“货架”,一个当做已经被查看后的缓冲区。

        1 2 3 4 5,顾客要的是3这个商品,

        顾客查找时进行如下步骤:

1. 1 2 入栈

2. 3 取出

3. 栈里的商品放回到货架里(栈顶元素加到双向队列前面,直到栈为空)

4. 将取出的 3 放回到双向队列前

        最后货架顺序为 3 1 2 4 5

        代码如下:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
ll sum, cnt;

deque<int> q;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	
	int n, m, k;
	cin >> n >> m >> k;
	for (int i = 1; i <= k; i ++) {
		int x;
		cin >> x;
		q.push_back(x);
	}


	for (int t = 1; t <= n; t ++) {
		for (int i = 1; i <= m; i ++) {
			stack<int> save;
			int x;
			cin >> x;
			while (q.front() != x) {
				cnt ++;
				save.push(q.front());
				q.pop_front();
			}
			sum += cnt + 1;
			int y = q.front();
			q.pop_front();
			while (!save.empty()) {
				q.push_front(save.top());
				save.pop();
			}
			q.push_front(y);
			cnt = 0;
		}
	}

	cout << sum;
	return 0;
}

如果您有更好的方法欢迎讨论以及指出文章中的错误之处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值