求助模拟退火
查看原帖
求助模拟退火
449265
wind_whisper楼主2021/12/17 16:35

本题我写的时候calc函数使用的是一种贪心的策略,具体就是:每两个分一组,贪心的选择让当前的两个分别去那个组,尽量使当前的两组差值最小,代码上具体就是:

inline int calc(){
  ll pl=1,res=0;
  while(pl<=n){
    ll d=abs(a[pl]-a[pl+1]);
    if(res>0) res-=d;
    else res+=d;
    pl+=2;
  }
  return abs(res);
}

然而,却取得了0分的好成绩...
只把这里改成第一篇题解直接取前一半的写法:

inline int calc(){
  for(int i=1;i<=n/2;i++) sum1+=a[i];
  for(int i=n/2+1;i<=n;i++) sum2+=a[i];
  return abs(sum1-sum2);
}

就A了...
(0分链接 100分链接
按照第一种方法似乎应该会更加高效,我本地和状压的正解对拍,n=30,T=10,ai105n=30,T=10,a_i\le10^5的情况下,大概 5~6组会出现一次差异,而直接取前一半的代码则几乎无法得出正确结果。 比如说,第一篇题解和我改后的代码在以下数据中: (为了便于阅读,已缩小规模并调整顺序,分别前5个和后5个就是最优答案31)

1
10
5222 91374 22283 85463 31532 31381 70633 66330 67307 192

第一篇题解的结果是2261(调换顺序前),而我改前代码和状压都是31
蒟蒻不太明白为什么,希望路过大佬帮助qwq
(如果谁有本题的数据也万分感谢!!!)

2021/12/17 16:35
加载中...