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.

题意:
商店由于空间限制,所有物品排列成一排。当收到要买第i个订单时,将逐行找到这个位置的商品的值,然后把这个商品位置下标找出,拿出来,并把它前面数往后移一位,然后把找到的这个商品移到最前面的位置,有n*m次这样的操作;让你求出在每一次pos后所有需要找出的商品的下标的和。
当时做时把题意看成是求所要找数的值加起来,刚好第一组样例过了,后来比完赛后发现就改成求查找的下标的和;就把一个地方给成num,就过了,好气,¥%&#@#3…
英语是硬伤!!!
解题思路:
使用两个数组,一个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;
}

翻译
商店包含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的索引。

全部评论

相关推荐

05-26 22:25
门头沟学院 Java
Java小肖:不会是想叫你过去把你打一顿吧,哈哈哈
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务