CODE FORCE 500C (New Year Book Reading) (贪心or 模拟)

来源:互联网 发布:淘宝客户管理 编辑:程序博客网 时间:2024/05/17 03:48

C. New Year Book Reading
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

New Year is coming, and Jaehyun decided to read many books during 2015, unlike this year. He has n books numbered by integers from 1 to n. The weight of the i-th (1 ≤ i ≤ n) book is wi.

As Jaehyun's house is not large enough to have a bookshelf, he keeps the n books by stacking them vertically. When he wants to read a certain book x, he follows the steps described below.

  1. He lifts all the books above book x.
  2. He pushes book x out of the stack.
  3. He puts down the lifted books without changing their order.
  4. After reading book x, he puts book x on the top of the stack.

He decided to read books for m days. In the j-th (1 ≤ j ≤ m) day, he will read the book that is numbered with integer bj (1 ≤ bj ≤ n). To read the book, he has to use the process described in the paragraph above. It is possible that he decides to re-read the same book several times.

After making this plan, he realized that the total weight of books he should lift during m days would be too heavy. So, he decided to change the order of the stacked books before the New Year comes, and minimize the total weight. You may assume that books can be stacked in any possible order. Note that book that he is going to read on certain step isn't considered as lifted on that step. Can you help him?

Input

The first line contains two space-separated integers n (2 ≤ n ≤ 500) and m (1 ≤ m ≤ 1000) — the number of books, and the number of days for which Jaehyun would read books.

The second line contains n space-separated integers w1, w2, ..., wn (1 ≤ wi ≤ 100) — the weight of each book.

The third line contains m space separated integers b1, b2, ..., bm (1 ≤ bj ≤ n) — the order of books that he would read. Note that he can read the same book more than once.

Output

Print the minimum total weight of books he should lift, which can be achieved by rearranging the order of stacked books.

Examples
input
3 51 2 31 3 2 3 1
output
12
Note

Here's a picture depicting the example. Each vertical column presents the stacked books.



题目大意:  n 本书,  每本书都有重量,  m天  一天读一本书   Mj  代表第j天 读 Mj书   读的书 可以重复;

当天要读的书, 要先把 上面的书移走,   问  最少的移动重量是多少;


方法一:  贪心的思想;  把所有的书, 包括天数在内的所有   放在一条直线上,  然后 从2 开始 扫描 知道扫到两个天数一样, 结束,  两者之间的 即为 要移动的重量;

方法二:  模拟操作,  按照读书顺序  放在一摞,  重复的书 只进行第一个操作;  模拟所有的操作;



法一代码:   

#include <iostream>#include <queue>#include <cstring>#include <algorithm>#include <stack>#include <stdio.h>typedef long long ll;const int MAXN=10100;using namespace std;int a[MAXN],b[MAXN];int vis[MAXN];int main(){    int n,m;    while(cin>>n>>m)    {         memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        for(int i=1;i<=n;i++)            cin>>a[i];        for(int i=1;i<=m;i++)            cin>>b[i];        ll sum=0;for(int i=2;i<=m;i++){memset(vis,0,sizeof(vis));for(int j=i-1;j>=1;j--){if(b[j]==b[i])break;if(!vis[b[j]]){sum+= a[b[j]];vis[b[j]]=1;}}}cout<<sum<<endl;    }    return 0;}/*5 72 4 9 5 63 2 4 1 5 2 43 51 1 13 2 1 2 3*/



法二代码:


#include <iostream>#include <queue>#include <cstring>#include <algorithm>#include <stack>#include <stdio.h>typedef long long ll;const int MAXN=10100;struct node{    int we;    int col;}c[MAXN];using namespace std;int a[MAXN],b[MAXN];int vis[MAXN];int main(){    int n,m;    while(cin>>n>>m)    {        memset(vis,0,sizeof(vis));        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        for(int i=1;i<=n;i++)            cin>>a[i];        for(int i=1;i<=m;i++)            cin>>b[i];        for(int i=1,k=1;i<=m;i++)        {            if(!vis[b[i]]) // 注意重复存储的问题;             {                c[k].we=a[b[i]];// 要用一个新的 k 值存储;                 c[k].col=b[i];                vis[b[i]]=1;                k++;            }        }        ll sum=0;        for(int i=1;i<=m;i++)// m天         {            for(int j=1;j<=n;j++)// 所有的书             {                if(c[j].we==a[b[i]]&&c[j].col==b[i])// 结束                 {                    int temp1=c[j].we;                    int temp2=c[j].col;                    for(int k=j;k>=1;k--)// 交换                     {                        c[k].we=c[k-1].we;                        c[k].col=c[k-1].col;                    }                    c[1].we=temp1;                    c[1].col=temp2;                    break;                }                else                    sum+=c[j].we;// 加重量             }        }        cout<<sum<<endl;    }    return 0;}/*5 72 4 9 5 63 2 4 1 5 2 43 51 1 13 2 1 2 3*/



123

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 水笔画在墙纸上怎么办 屋里有股石灰味怎么办 厨房太阳对着晒怎么办 房子有太阳西斜怎么办 房子晒到太阳很热怎么办 房子被太阳热了怎么办 房间西晒窗帘不遮光怎么办 新建房屋一面墙体有裂缝怎么办 卫生间地砖缝隙出现渗水怎么办 西户窗户太晒怎么办 西晒的墙面很烫怎么办 儿童房颜色太粉了怎么办? 小孩在家里偷钱怎么办 脾气不好的猫该怎么办 二年孩子偷钱怎么办 孩子偷钱2000报警怎么办? 我儿子十岁老是偷钱怎么办 13孩子偷同学钱怎么办 孩子偷同学的钱怎么办 儿子十四岁了老偷钱怎么办 发现初中生的儿子偷钱怎么办 被亲戚怀疑儿子偷钱怎么办 房门选的太白了怎么办 大厅地砖颜色比墙砖浅怎么办 房屋外墙渗水物业不管怎么办 走丢了怎么办教学反思 托班教案迷路了怎么办 大班安全教案遇到小偷怎么办 小班孩子舞台表演找不到位置怎么办 懂你英语学完了怎么办 小班社会走丢了怎么办 帮小老鼠搬鸡蛋怎么办 小老鼠还能怎么办鸡蛋 中班教案走丢了怎么办 走丢了怎么办可后反思 社会走丢了怎么办教案 孩子一直不吃幼儿园的饭怎么办 大班安全游泳抽筋怎么办反思 汤洒了怎么办教学反思 迷路了怎么办小班详案 大班牙又痛又摇怎么办