题意:给你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; }