“深圳计算科研院杯”B-Mr.Maxwell and attractions(优先队列模拟)
题意:
有n个室内场所,m个室外场所,每个场所都有个初始权值,对于同一个场所第一次去权值为
a
i
a_i
ai,以后每次去权值都会乘以0.6;其中若下午去室外场所,权值要乘以格外的0.8;一天可以选择上午或下午去。现在有T天,其中K天必须去室外场所,求这T天去的所有场所的权值和最大(同一个场所可以重复去)
思路:
优先队列模拟,注意细节。分情况讨论。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e2+5;
int n,m,t,k;
struct node{
double num;
bool col;
bool vis;
bool operator < (const node &x)const{
return num<x.num;
}
};
priority_queue<node>p;
int main(){
scanf("%d%d%d%d",&n,&m,&t,&k);
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
p.push((node){x*1.0,1,0});
}
for(int i=1,x;i<=m;i++){
scanf("%d",&x);
p.push((node){x*1.0,0,0});
}
int d=t-k;
double ans=0;
while(k!=0||d!=0){
node x=p.top();
p.pop();
if(x.col){
ans+=x.num;
x.num*=0.6;
p.push(x);
if(k)k--;
else d--;
}
else{
if(d==0){
if(x.vis){
ans+=x.num;
x.num*=0.6;
p.push(x);
k--;
}
else{
x.num*=0.8;
x.vis=1;
p.push(x);
}
}
else{
ans+=x.num;
x.num*=0.6;
p.push(x);
d--;
}
}
}
printf("%.2lf\n",ans);
}