B. Shopping

题目链接:https://codeforces.com/problemset/problem/665/B
Ayush is a cashier at the shopping center. Recently his department has started a ''click and collect" service which allows users to shop online.

The store contains k items. n customers have already used the above service. Each user paid for m items. Let aij denote the j-th item in the i-th person’s order.

Due to the space limitations all the items are arranged in one single row. When Ayush receives the i-th order he will find one by one all the items aij (1 ≤ j ≤ m) in the row. Let pos(x) denote the position of the item x in the row at the moment of its collection. Then Ayush takes time equal to pos(ai1) + pos(ai2) + … + pos(aim) for the i-th customer.

When Ayush accesses the x-th element he keeps a new stock in the front of the row and takes away the x-th element. Thus the values are updating.

Your task is to calculate the total time it takes for Ayush to process all the orders.

You can assume that the market has endless stock.

Input
The first line contains three integers n, m and k (1 ≤ n, k ≤ 100, 1 ≤ m ≤ k) — the number of users, the number of items each user wants to buy and the total number of items at the market.

The next line contains k distinct integers pl (1 ≤ pl ≤ k) denoting the initial positions of the items in the store. The items are numbered with integers from 1 to k.

Each of the next n lines contains m distinct integers aij (1 ≤ aij ≤ k) — the order of the i-th person.

Output
Print the only integer t — the total time needed for Ayush to process all the orders.

Example
Input
2 2 5
3 4 1 2 5
1 5
3 1
Output
14
Note
Customer 1 wants the items 1 and 5.

pos(1) = 3, so the new positions are: [1, 3, 4, 2, 5].

pos(5) = 5, so the new positions are: [5, 1, 3, 4, 2].

Time taken for the first customer is 3 + 5 = 8.

Customer 2 wants the items 3 and 1.

pos(3) = 3, so the new positions are: [3, 5, 1, 4, 2].

pos(1) = 3, so the new positions are: [1, 3, 5, 4, 2].

Time taken for the second customer is 3 + 3 = 6.

Total time is 8 + 6 = 14.
Formally pos(x) is the index of x in the current row.

商店包含k个项目。 n客户已使用上述服务。每个用户支付m项。让aij表示第i个人的顺序中的第j个项目。由于空间限制,所有物品排列成一排。当Ayush收到第i个订单时,他将逐一找到该行中所有项目aij(1≤j≤m)。设pos(x)表示项目x在收集时的行中的位置。然后Ayush花费时间等于pos(ai1)+ pos(ai2)+ … + pos(目标)为第i个顾客。
当Ayush访问第x个元素时,他在行的前面保留一个新的股票并取走第x个元素。因此值正在更新。
您的任务是计算Ayush处理所有订单所需的总时间。
你可以假设市场有无穷无尽的股票。
输入
第一行包含三个整数n,m和k(1≤n,k≤100,1≤m≤k) - 用户数量,每个用户想要购买的商品数量以及市场上的商品总数。

下一行包含k个不同的整数pl(1≤pl≤k),表示商店中商品的初始位置。这些项目的编号为1到k之间的整数。

接下来的n行中的每一行包含m个不同的整数aij(1≤aik≤k) - 第i个人的顺序。

产量
打印唯一的整数t - Ayush处理所有订单所需的总时间。


输入
2 2 5
3 4 1 2 5
1 5
3 1
产量
14
注意
客户1需要项目1和5。

pos(1)= 3,所以新的位置是:[1,3,4,2,5]。

pos(5)= 5,所以新的位置是:[5,1,3,4,2]。

第一位客户的时间是3 + 5 = 8。

客户2想要商品3和1。

pos(3)= 3,所以新的位置是:[3,5,1,4,2]。

pos(1)= 3,所以新的位置是:[1,3,5,4,2]。

第二个客户的时间是3 + 3 = 6。

总时间为8 + 6 = 14。
正式pos(x)是当前行中x的索引。

题意: 商店由于空间限制,所有物品排列成一排。当收到要买第i个订单时,将逐行找到这个位置的商品的值,然后把这个商品位置下标找出,并拿出来把它们往后移一位,然后把找到的这个商品移到最前面的位置,有n*m次这样的操作;

解题思路:使用两个数组,一个a数组存入要输入的数,另一个b数组也同样存入这样的数,之后把输入的一个数,找出它再a数组的位置下标,拿出这个数,然后这个数前面的数都往后移,再将这个数放到最前面,然后每次用b数组做桥梁;

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include<queue>
#include <math.h>
#include <string.h>
#define ll long long
#define pi 3.14159265358979
using namespace std;
const int MAXN=500;
int b[MAXN],w[MAXN];
int main()
{
    int a,bb,c,s;
    while(cin>>a>>bb>>c){
    memset(b,0,sizeof(b));
    memset(w,0,sizeof(w));
    for(int i=1;i<=c;i++)
    {
        cin>>b[i];
        w[i]=b[i];
    }
    int sum;
    ll num=0;
    for(int i=0;i<a;i++)
    {
        for(int j=0;j<bb;j++)
        {
            cin>>s;//输入一个值
            for(int k=1;k<=c;k++)
            {
                if(s==b[k])//查找到这个值的下标
                {
                    sum=k;//记录下标
                    break;
                }
            }
            num+=sum;//将找到的下标的值进行相加
           // cout<<num<<"*"<<endl;
            b[1]=b[sum];//开始把要查找的那个数,拿出来移到最前面,把数往后移一位,形成新的位置
            for(int k=1;k<=c;k++)
            {
                if(k==sum)//指标到之前找到的那个下标的位置时,后面的数其实就不用改变了;
                    break;
                b[k+1]=w[k];
            }
            for(int k=1;k<=c;k++)
            {
                w[k]=b[k];
               //cout<<w[k]<<" ";
            }
            //cout<<endl;
        }
    }
    cout<<num<<endl;
    }
    return 0;
}

上一篇:数组


下一篇:数组