本题我写的时候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,ai≤105的情况下,大概 5~6组会出现一次差异,而直接取前一半的代码则几乎无法得出正确结果。
比如说,第一篇题解和我改后的代码在以下数据中:
(为了便于阅读,已缩小规模并调整顺序,分别前5个和后5个就是最优答案31)
1
10
5222 91374 22283 85463 31532 31381 70633 66330 67307 192
第一篇题解的结果是2261(调换顺序前),而我改前代码和状压都是31
蒟蒻不太明白为什么,希望路过大佬帮助qwq
(如果谁有本题的数据也万分感谢!!!)