码迷,mamicode.com
首页 > 其他好文 > 详细

CF 500 C. New Year Book Reading 贪心 简单题

时间:2015-09-11 00:00:15      阅读:495      评论:0      收藏:0      [点我收藏+]

标签:

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.

Sample test(s)
input
3 5
1 2 3
1 3 2 3 1
output
12
 

 

 

 

题意:有n本书,编号为1~n,每一本书的重量为w[i],这堆书竖直堆在一起

现在有m天,第i天会从中拿出编号为day[i]的书看,代价是day[i]上面的书的总重量,书一天看完,看完后放在最上面。

 

问:最开始的时候你按照什么顺序放书,会让你这m天要搬的书的总重量最小。

 

贪心可知,拿每一本书第一次出现的序列作为初始序列,没有出现的序列放在最下面,不用管了。

 

用一个vector存放这个序列,看完后放在最上面删除,插入到最上面。

 

 

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<iostream>
 5 
 6 using namespace std;
 7 
 8 #define ll long long
 9 #define pb push_back
10 
11 bool vis[505];
12 int w[505];
13 int day[1005];
14 vector<int>v;
15 
16 int main()
17 {
18     int n,m;
19     scanf("%d %d",&n,&m);
20     for(int i=1;i<=n;i++){
21         scanf("%d",&w[i]);
22     }
23     memset(vis,false,sizeof vis);
24     for(int i=1;i<=m;i++){
25         scanf("%d",&day[i]);
26         if(!vis[day[i]]){
27             v.pb(day[i]);
28             vis[day[i]]=true;
29         }
30     }
31     int ans=0;
32     for(int i=2;i<=m;i++){
33         int j=0;
34         for(;v[j]!=day[i];j++){
35             ans+=(ll)(w[v[j]]);
36         }
37         v.erase(v.begin()+j);
38         v.insert(v.begin(),day[i]);
39     }
40 
41     printf("%d\n",ans);
42 
43     return 0;
44 }
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CF 500 C. New Year Book Reading 贪心 简单题

标签:

原文地址:http://www.cnblogs.com/-maybe/p/4799668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!