退火求调
查看原帖
退火求调
476620
TempestJueMu楼主2022/7/14 13:10

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;
}
2022/7/14 13:10
加载中...