https://codeforces.com/contest/665/problem/B

本题的意思是你有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;
}

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