rt,不知道是我写挂了还是这题退火不太行。
样例能过。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int id;
double mon;//原价
int p;//优惠的前提
double mon_;//优惠
int num;//数量
}e[52];
bool buy[52];
double ans,nowans;
int n,k;
double calc()
{
double ret=0;
for(int i=1;i<=n;++i)
{
int now=e[i].id;
buy[now]=1;
if(buy[e[now].p])ret+=e[now].mon_*e[now].num;
else ret+=e[now].mon*e[now].num;
}
return ret;
}
void SA()
{
double T=5000;
while(T>1e-9)
{
int x=rand()%n+1,y=rand()%n+1;
swap(e[x],e[y]);
nowans=calc();
if(nowans<ans)ans=nowans;
else if(exp((ans-nowans)/T)<double(rand())/RAND_MAX)swap(e[x],e[y]);
T*=0.997;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%lf%d",&e[i].mon,&e[i].num),e[i].id=i;
scanf("%d",&k);
for(int i=1,A,B;i<=k;++i)
{
scanf("%d%d",&A,&B);
e[B].p=A;scanf("%lf",&e[B].mon_);
}
ans=calc();
for(int i=1;i<=50;++i)SA();
printf("%.2f",ans);
return 0;
}