zoukankan      html  css  js  c++  java
  • 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 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
    ",ans);
    42 
    43     return 0;
    44 }
    View Code
  • 相关阅读:
    搭建一个简单的springMVC框架
    java枚举使用
    java中枚举类型的使用
    java递归算法
    JAVA递归算法及经典递归例子 对于这个汉诺塔问题
    java斐波纳契数列
    要求给一个数值,计算它的阶乘
    AcWing2193 分配问题(二分图最优匹配)
    2020上海大学校赛L 动物森友会(网络流+二分)
    BZOJ2654 tree(wqs二分)
  • 原文地址:https://www.cnblogs.com/-maybe/p/4799668.html
Copyright © 2011-2022 走看看