蒟蒻有个疑惑,求解(关于思路)
查看原帖
蒟蒻有个疑惑,求解(关于思路)
669171
z_yq楼主2024/10/22 16:36

正常的思路我会首先,所以不要跟lz说什么写正解,lz会,但是太sb了,想要另辟蹊径:
我的想法如下,看到样例和一些奇奇怪怪的东西,会发现这个题目随着分配给国内的廊桥的数量变多,它的答案(样例)是呈现出了一个单峰函数的。
但是由于无法严谨证明,会发现这压根就不是单峰函数
于是lz最近打比赛的时候经常使用模拟退火去水分,想到了模拟退火也可以面对这种多峰函数的时候,lz可开心了,于是写了一个模拟退火
遂:没有T掉,只有35分,甚至不如暴力,所以,what can I do?
如果是模拟退火不能过,这里另说,如果是我写错了,那请指出一下,想要知道模拟退火这道题目是不是有问题还是只能水分,代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const double temp=1e5,MAX_TIME=0.96;
const int N=1e5+9;
int n,m1,m2,ansx,ans;
struct node1{ll lt,rt;}a1[N];
struct node2{ll lt,rt;}a2[N];
priority_queue<int,vector<int>,greater<int>>que,que2;
inline int check(int x)
{
    int num=0,tp=0;
    while(!que.empty())que.pop();
    while(!que2.empty())que2.pop();
    for(int i=1;i<=m1;i++)
    {
        while(!que.empty() && a1[i].lt>=que.top())tp--,que.pop();
        if(tp<x)tp++,num++,que.push(a1[i].rt);
    }
    tp=0;
   // cout<<x<<"------\n";
    for(int i=1;i<=m2;i++)
    {
        while(!que2.empty() && a2[i].lt>=que2.top())tp--,que2.pop();
        if(tp<n-x)tp++,num++,que2.push(a2[i].rt);
  //      cout<<i<<' '<<num<<' '<<tp<<' '<<n-x<<endl;
    }
    //cout<<num<<endl;
    return num;
}
inline void simulateAnneal()
{
    double temperature=temp,delta=0.995;
    while(temperature>1e-3)
    {
        while((double)clock()/CLOCKS_PER_SEC>MAX_TIME)return;
        int nansx=rand()*rand()%(n+1),nans=check(nansx);
    //    cout<<nansx<<' '<<nans<<endl;
        if(nans>ans)ans=nans,ansx=nansx;
        else if(exp((nansx-ansx)/temperature)*RAND_MAX>rand())ansx=nansx;
        temperature*=delta;
    }
}
inline bool cmp1(node1 x,node1 y){return x.lt==y.lt?x.rt<y.rt:x.lt<y.lt;}
inline bool cmp2(node2 x,node2 y){return x.lt==y.lt?x.rt<y.rt:x.lt<y.lt;}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>m1>>m2;srand(time(NULL));
    for(int i=1;i<=m1;i++)cin>>a1[i].lt>>a1[i].rt;
    for(int i=1;i<=m2;i++)cin>>a2[i].lt>>a2[i].rt;
    sort(a1+1,a1+m1+1,cmp1);sort(a2+1,a2+m2+1,cmp2);
    while((double)clock()/CLOCKS_PER_SEC<MAX_TIME)simulateAnneal();
    cout<<ans;
    return 0;
}
2024/10/22 16:36
加载中...