贪心与模拟
链接:https://ac.nowcoder.com/acm/contest/11168/B
来源:牛客网
题目描述
在一个竖直的洞里有 n 个有重量的球,需要进行 m 次操作,每次操作需要将其中一个球拿出来然后放在最上面 。
取出一个小球放在最上面需要消耗的体力为它上面的小球的重量之和 。
现在给定每次操作需要取的小球的编号,要求出一种初始的放球方案使得消耗的总体力最少 。
输入描述:
第一行两个正整数 n 和 m,意义如题所示 。
第二行 n 个正整数,分别表示 n 个球的重量 。
第三行 m 个正整数,分别表示 m 次操作取出小球的编号 。
输出描述:
一个整数表示消耗的总体力的最小值 。
示例1
输入
复制
3 3
1 2 3
3 2 1
输出
复制
8
备注:
n,m <= 2000,1 <= 每个小球的重量 <= 100 。
#include<bits/stdc++.h>//很简单的问题 不知道当时为什么要nc复杂化记录重量 直接记录编号 按顺序模拟
using namespace std;// 贪心则是直接按题号顺序即可
typedef long long ll;
#define INF 0x3f3f3f3f
int a[2009],arr[2009],book[2009],ans,sum;
int main() {
int n,m,len=0;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1,j;i<=m;i++){
int x;
cin>>x;
if(!book[x]){
book[x]=1;
arr[++len]=x;
}
sum=0;
for( j=1;j<=len;j++){
if(arr[j]==x){
arr[0]=x;
break;
}
sum+=a[arr[j]];
}
for(int k=j;k>0;k--)arr[k]=arr[k-1];
ans+=sum;
}
cout<<ans;
return 0;
}