博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 500c New Year Book Reading 【思维】
阅读量:6801 次
发布时间:2019-06-26

本文共 3446 字,大约阅读时间需要 11 分钟。

 

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次书(一本书可以反复读)。这n本书是叠放在一起的,每次读一本书要把上面的书移开,在把书给取走。并且读完之后要把它放在最上面,要你求出读完所有书的最小移动重量。

思路:不管最开始如何放置,最先读的书一定是在后面读的书的上面,所以只能要求在读某一本书的时候后,保证上面的都是读过的书就可以。所以,这也就确定了最开始的排列顺序——按照读书的顺序。然后再统计每次读的时候所移动书的重量就可以了。

#include #include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
//#define LOACL#define space " "using namespace std;//typedef long long LL;//typedef __int64 Int;typedef pair
paii;const int INF = 0x3f3f3f3f;const double ESP = 1e-5;const double PI = acos(-1.0);const int MOD = 1e9 + 7;const int MAXN = 1e5;int weight[MAXN], pos[MAXN];int st[MAXN], num[MAXN];bool vis[MAXN];int main() { int n, m; while (scanf("%d%d", &n, &m) != EOF) { memset(vis, 0, sizeof(vis)); for (int i = 1; i <= n; i++) { scanf("%d", &weight[i]); } int cnt = 0; for (int i = 0; i < m; i++) { scanf("%d", &st[i]); if (!vis[st[i]]) { pos[cnt++] = st[i]; vis[st[i]] = true; } } int ans = 0; memset(vis, 0, sizeof(vis)); cnt = 0; //遍历每天 for(int i = 0; i < m; i++) { int p; for (p = 0; pos[p] != st[i]; p++) { ans += weight[pos[p]]; } for(int j = p;j >= 1; j--) pos[j] = pos[j - 1]; pos[0] = st[i]; } printf("%d\n", ans); } return 0;}

 

 

 

转载于:https://www.cnblogs.com/cniwoq/p/6770790.html

你可能感兴趣的文章
018 easygui的使用
查看>>
iphone 开发h5 踩过的坑
查看>>
微信支付demo集
查看>>
python读取json的工具jsonreader | the5fire的技术博客
查看>>
linux内核参数优化
查看>>
Asp.net性能优化之总结
查看>>
八、 异步调用WebService
查看>>
全文检索、数据挖掘、推荐引擎系列---去除停止词添加同义词
查看>>
织梦模板修改方法大全
查看>>
android 开发之电子钢琴 源码
查看>>
Grid.SharedSizeGroup
查看>>
每个开发人员现在应该下载的十种必备工具
查看>>
ubuntu11.10真机调试no-permissions
查看>>
如何判断某个事件已经绑定了某个事件处理程序?
查看>>
zipimport — Import modules from Zip archives¶
查看>>
金山快盘登陆签到
查看>>
C#中类的概念
查看>>
Primary key、unique、index之间的关系
查看>>
关于完美的练习
查看>>
heap&stack 区别
查看>>