Codeforce500C New Year Book Reading

题意:给你n本书的重量,m天读书的顺序,书是一堆在一起的,每次拿一本书要把去其他书搬下来,拿出这本书, 然后把这些书搬上去,读完这本书要把书放在最上面,问按照读书顺序最少要搬多重的书

题解:直接贪心就可以了,尽量靠前的书要放在上面,模拟一遍就可以,。。写错了一个地方,调了好久。

#include <bits/stdc++.h>
#define ll long long
#define maxn 100100
using namespace std;
stack<int>s;
map<int ,int >mp;
int w[maxn], d[maxn], temp[maxn];
int main(){
    int n, m, ans = 0, to, num = 0;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>w[i];
    for(int i=1;i<=m;i++) cin>>d[i];
    for(int i=1;i<=m;i++)
        if(mp[d[i]] == 0) temp[num++] = d[i],mp[d[i]]=1;
    for(int i=num-1;i>=0;i--) s.push(temp[i]);
    n = s.size();
    num = 0;
    for(int i=1;i<=m;i++){
        while(1){
            to = s.top();s.pop();
            if(to == d[i]) break;
            temp[num++] = to;
            ans += w[to];
        }
        for(int j=num-1;j>=0;j--)
            s.push(temp[j]);
        num = 0;
        s.push(d[i]);
    }
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/Noevon/p/7277224.html