题目大意:把$n(n\leqslant30)$个数分成两组,两组个数最多相差$1$,求出两组元素差的绝对值最小使多少

题解:模拟退火

卡点:$\exp$中的两个数相减写反,导致$\exp(x)$中的$x>0$,$\exp(x)>1$,相当于一直接受生成的解

C++ Code:

  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <cmath>
  4. #define maxn 32
  5. inline long long abs(long long a) {return a > 0 ? a : -a;}
  6. int T, n, divn;
  7. long long sum;
  8.  
  9. const double ST = 100, delT = 0.9992, eps = 1e-5;
  10. int Tim = 20;
  11. struct node {
  12. int s[maxn];
  13. long long w;
  14. } ans;
  15. inline long long calc(node &x) {
  16. long long __sum = 0;
  17. for (int i = 0; i < divn; i++) __sum += x.s[i];
  18. x.w = abs(sum - __sum - __sum);
  19. if (n & 1) x.w = std::min(x.w, abs(sum - __sum - __sum - x.s[divn] - x.s[divn]));
  20. return x.w;
  21. }
  22. inline double rand_d() {return static_cast<double> (rand()) / RAND_MAX;}
  23.  
  24. void SA() {
  25. double T = ST;
  26. node now = ans, nxt;
  27. while (T > eps) {
  28. nxt = now;
  29. int x = rand() % n, y = rand() % n;
  30. T *= delT;
  31. if (x == y) continue;
  32. std::iter_swap(nxt.s + x, nxt.s + y);
  33. long long del = calc(nxt);
  34. if (del < now.w || exp((now.w - del) / T) > rand_d()) now = nxt;
  35. if (del < ans.w) ans = nxt;
  36. }
  37. }
  38. int main() {
  39. srand(20040826);
  40. scanf("%d", &T);
  41. while (T --> 0) {
  42. scanf("%d", &n); divn = n >> 1;
  43. sum = 0;
  44. for (int i = 0; i < n; i++) scanf("%d", ans.s + i), sum += ans.s[i];
  45. if (n == 1) {
  46. printf("%d\n", *ans.s);
  47. continue;
  48. }
  49. std::random_shuffle(ans.s, ans.s + n);
  50. calc(ans);
  51. for (int i = 0; i < Tim; i++) SA();
  52. printf("%lld\n", ans.w);
  53. }
  54. return 0;
  55. }

  

[洛谷P3878][TJOI2010]分金币的更多相关文章

  1. luogu P3878 [TJOI2010]分金币

    [返回模拟退火略解] 题目描述 今有 nnn 个数 {ai}\{a_i\}{ai​},把它们分成两堆{X},{Y}\{X\},\{Y\}{X},{Y},求一种分配使得∣∑i∈Xai−∑i∈Yai∣|\ ...

  2. [luogu3878][TJOI2010]分金币【模拟退火】

    题目描述 现在有n枚金币,它们可能会有不同的价值,现在要把它们分成两部分,要求这两部分金币数目之差不超过1,问这样分成的两部分金币的价值之差最小是多少? 分析 根据模拟退火的基本套路,先随机分两堆金币 ...

  3. 洛谷P1154 奶牛分厩

    P1154 奶牛分厩 173通过 481提交 题目提供者该用户不存在 标签高性能 难度普及- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 测试点3??? 求助!超时了 我抗议 ...

  4. 洛谷——P1154 奶牛分厩

    P1154 奶牛分厩 题目描述 农夫约翰有N(1<=N<=5000)头奶牛,每头奶牛都有一个唯一的不同于其它奶牛的编号Si,所有的奶牛都睡在一个有K个厩的谷仓中,厩的编号为0到K-1.每头 ...

  5. [TJOI2010]分金币

    嘟嘟嘟 看数据范围,就能想到折半搜索. 但怎么搜,必须得想清楚了. 假设金币总数为1000,有20个人,首先搜前10个人,把答案记下来.然后如果在后十个人中搜到了4个人,价值为120,那么我们应该在记 ...

  6. 洛谷 P3871 [TJOI2010]中位数 解题报告

    P3871 [TJOI2010]中位数 题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前 ...

  7. 【洛谷】P2694 接金币(排序)

    题目描述 在二维坐标系里,有N个金币,编号0至N-1.初始时,第i个金币的坐标是(Xi,Yi).所有的金币每秒向下垂直下降一个单位高度,例如有个金币当前坐标是(xf, yf),那么t秒后金币所在的位置 ...

  8. 洛谷 P3879 [TJOI2010]阅读理解

    P3879 [TJOI2010]阅读理解 题目描述 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输入输出 ...

  9. 洛谷——P3871 [TJOI2010]中位数

    P3871 [TJOI2010]中位数 一眼秒掉,这不是splay水题吗,套模板 #include<bits/stdc++.h> #define IL inline #define N 1 ...

随机推荐

  1. 「日常训练」Girls and Boys(HDU-1068)

    题意 有n个同学,给出同学之间的爱慕关系,选出一个集合使得集合中的人没有爱慕关系.问能选出的最大集合是多少. 分析 二分图的最大独立集. 最大独立集的意思是,在图中选出最多的点,使他们两两之间没有边, ...

  2. hdu5698瞬间移动(杨辉三角+快速幂+逆元)

    瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  3. lintcode702 连接两个字符串中的不同字符

    连接两个字符串中的不同字符   给出两个字符串, 你需要修改第一个字符串,将所有与第二个字符串中相同的字符删除, 并且第二个字符串中不同的字符与第一个字符串的不同字符连接 思路:遍历两个字符串,找到互 ...

  4. 加密SecurityHelper

    接下来给大家分享一下我用的加密helper,现在只用的md5加密的方法,网上很多方法找到的时候加密完了会变成乱码,这样对于密码这种字段保存的时候就会出错.其实只需要把加密完的byte字节转化成16位就 ...

  5. C++clock()延时循环

    函数clock(),返回程序开始执行后所用的系统时间,但是有两个复制问题. 1.clock()返回时间的单位不一定是秒 2.该函数的返回类型在某些系统上可能是Long,也可能是unsigned lon ...

  6. RedHat/CentOS利用iso镜像做本地yum源

    在这里用iso或者光盘做本地yum源的方法是差不多的,只是用光盘的话Linux系统会自动挂载,用iso镜像的或需要手动挂载,这里就说挂载iso的方法吧. (1) 创建iso存放目录和挂载目录 mkdi ...

  7. POJ 1755 Triathlon(线性规划の半平面交)

    Description Triathlon is an athletic contest consisting of three consecutive sections that should be ...

  8. 【转】Keepalived+Tengine实现高可用集群

    原文出处:http://502245466.blog.51cto.com/7559397/1301772 概述 近年来随着Nginx在国内的发展潮流,越来越多的互联网公司使用Nginx:凭Nginx的 ...

  9. Vue于React特性简单对比(一)

    一,对象实体对比 vue的对象实体依然是html,而react的对象实体已经变味jsx,一种新的语法结构. vue的html与react的jsx都可以进行拆分,拆分成更细小的组件,组件之间可以传值. ...

  10. DVD与CD区别

    经常听朋友说什么DVD什么CD什么的,不知道到底有什么区别,专门百度找了下,找到以下资料 ======================================================= ...