题目描述
除夕夜到来的前夕,小科正在和家人们布置家里的各个角落,使得整个家看起来更有新年氛围。春联已经贴过了,那么接下来小科需要将福字贴纸贴在家里的n块玻璃上。已知n块玻璃大小不完全相同,所以贴每块玻璃上的福字时,消耗的体力值不完全相同,但是耗费的时间相同,都是一个单位时间。同时,妈妈为了锻炼小科的工作效率,给每块玻璃都规定了一个最迟完成的时间期限,如果在这个期限前没有完成的话,那么小科将会得到一定的惩罚任务,这个惩罚任务需要消耗的体力值,是这块玻璃对应消耗体力值的两倍。现在给你每块玻璃需要消耗的体力值,以及他们的规定时间期限,问你能不能帮助小科安排他的贴福计划,使得他最终消耗的总体力值最小,最小体力值为多少,假设小科的体力值是不会用完的。
输入格式
输入共3行。
第1行:一个整数n,表示玻璃的数量,n<=100
第2行:n个整数以空格分隔,分别表示每块玻璃的规定完成期限(0<d<=n)
第3行:n个整数以空格分隔,分别表示每块玻璃需要消耗的体力值(10<=k<=1000)
输出格式
第1行:一个整数,为最终消耗的最小体力值
输入输出样例
输入样例1:
5 4 2 3 3 1 100 50 80 120 200
输出样例1:
600
说明
【输入输出样例 1 说明】
消耗体力为100的任务安排在时间点4完成,消耗体力100
消耗体力为50的任务无法在期限内完成,消耗体力50*2=100
消耗体力为80的任务安排在时间点2完成,消耗体力80
消耗体力为120的任务安排在时间点3完成,消耗体力120
消耗体力为200的任务安排在时间点1完成,消耗体力200
共600体力。
【数据规模与约定】
对于 100%的数据:0<d<=n<=100,0<=k<=1000。
【耗时限制】1000ms 【内存限制】128MB
//
//Created by Carlgood.
//
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
using namespace std;
struct work
{
int wi;
int di;
}a[111];
bool cmp(const work &x,const work &y)
{
return x.wi>y.wi;
}
bool flag[111];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].di;
}
for(int i=1;i<=n;i++)
{
cin>>a[i].wi;
}
sort(a+1,a+n+1,cmp);
int ans=0;
for(int i=1;i<=n;i++)
{
bool ok=false;
for(int j=a[i].di;j>=1;j--)
{
if(flag[j]==false)
{
flag[j]=true;
ok=true;
break;
}
}
if(!ok) ans+=a[i].wi*2;
else ans+=a[i].wi;
}
cout<<ans;
return 0;
}