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

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 51 2 31 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 }

时间: 2024-12-10 11:38:46

CF 500 C. New Year Book Reading 贪心 简单题的相关文章

CF 500 C New Year Book Reading

New Year Book Reading Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description 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.

POJ 2393 贪心 简单题

有一家生产酸奶的公司,连续n周,每周需要出货numi的单位,已经知道每一周生产单位酸奶的价格ci,并且,酸奶可以提前生产,但是存储费用是一周一单位s费用,问最少的花费. 对于要出货的酸奶,要不这一周生产,要不提前生产. 什么时候采用什么生产方式呢? 若第i周的货提前生产的话,假设在j周生产,则费用为(i-j)*s+c[j] 若c[i]>(i-j)*s+c[j],则更新c[i]=(i-j)*s+c[j] 更新要O(n^2)? 可以证明,最优的生产方式是,要不在这一周生产,要不在上一周生产(这里的上

cf 620C Pearls in a Row(贪心)

d.有一串数字,要把这些数字分成若干连续的段,每段必须至少包含2个相同的数字,怎么分才能分的段数最多? 比如 是1 2 1 3 1 2 1 那么 答案是 21 34 7 即最多分在2段,第一段是1~3,第二段是4~7. 即分成这2段:1 2 1,3 1 2 1 s.很不错的一道贪心的题.当时没怎么细想,后来看了tourist的代码后得知. 可以证明,满足贪心选择性质和最优子结构性质. 贪心策略是:从前向后遍历,每次选择最小长度的符合条件的段. c. #include<iostream> #in

hdu 4550 贪心 思维题 不错

http://acm.hdu.edu.cn/showproblem.php?pid=4550 想了挺久,然后各种分类 终于AC,如果是现场,对自己没信心的话,估计还是要WA,,,,,,然后搜题解,发现人家都认为是简单题,看来我还是太弱了,牡丹江没有做出来K看来还是自己贪心和思维有问题 d是一个Deque 最朴素的算法是,如果当前的数<=d.front(),那么插入队列的前面,否则插入队列后面,但是有零所以需要单独处理,还是自己多举例找规律 我的策略: 1.记录0的个数zero,最小非零的数的个数

贪心/思维题 Codeforces Round #310 (Div. 2) C. Case of Matryoshkas

题目传送门 1 /* 2 题意:套娃娃,可以套一个单独的娃娃,或者把最后面的娃娃取出,最后使得0-1-2-...-(n-1),问最少要几步 3 贪心/思维题:娃娃的状态:取出+套上(2),套上(1), 已套上(0),先从1开始找到已经套好的娃娃层数, 4 其他是2次操作,还要减去k-1个娃娃是只要套上就可以 5 详细解释:http://blog.csdn.net/firstlucker/article/details/46671251 6 */ 7 #include <cstdio> 8 #i

codeforces 500C New Year Book Reading (贪心,很好的思维题)

C. New Year Book Reading time limit per test 2 seconds memory limit per test 256 megabytes 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-

CF 990B B. Micro-World【数组操作/贪心/STL/二分搜索】

[链接]:CF [题意]:对任意一个数a[i] ,可以对任意 满足 i != j 且 a[i] > a[j] && a[i] <= a[j] +k 的 a[j] 可以被删掉,求使最终剩下的个数最少. [分析]:扫一遍,二分搜索合法的. [代码]: #include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream>

CF 1249D1 - Too Many Segments (easy version) 贪心+排序+set的使用

https://codeforces.com/blog/entry/70779 分析:想到在要删去一条线段时贪心的选取右坐标最长的那一个肯定正确. 就可以利用排序,即set的自动排序再重定义运算符来处理(按左坐标的顺序插入,按右坐标大小排序),用size()表示覆盖的边数,坐标从左到右一个个该删删该增增,维护一遍. 一个技巧:vector<Node> segs[maxn]  的Node 是右坐标 和 线段的序号,而用数组下标用左坐标来表示,就能够实现上述的坐标上扫一遍的处理. #include

CF 500 B. New Year Permutation 并查集

User ainta has a permutation p1, p2, ..., pn. As the New Year is coming, he wants to make his permutation as pretty as possible. Permutation a1, a2, ..., an is prettier than permutation b1, b2, ..., bn, if and only if there exists an integer k (1 ≤ k