题目描述 现在有n枚金币,它们可能会有不同的价值,现在要把它们分成两部分,要求这两部分金币数目之差不超过1,问这样分成的两部分金币的价值之差最小是多少? 分析 根据模拟退火的基本套路,先随机分两堆金币,然后每一次随机从两堆中取出一个,进行交换,看看答案是否更优[太简单了,不多赘述] ac代码 #include <bits/stdc++.h> #define ms(a, b) memset(a, b, sizeof(a)) #define inf 0x3f3f3f3f #define db do…
题目描述 现在有n枚金币,它们可能会有不同的价值,现在要把它们分成两部分,要求这两部分金币数目之差不超过1,问这样分成的两部分金币的价值之差最小是多少? 输入输出格式 输入格式: 每个输入文件中包含多组测试数据,输入文件的第一行是一个正整数T,用来说明文件中有多少组测试数据.接下来将依次给出所有测试数据的描述,每组测试数据的第一行是一个正整数n,表示共有n枚金币.第二行有n个正整数vi,分别给出每一枚金币的价值. 输出格式: 对每一组输入数据,输出一个非负整数,表示分成的两部分金币的价值差别的最…
这题和在我长郡考试时的一道题思路差不多...考虑折半搜索,预处理左半边选的方案所产生的数量差值\(x\)以及价值差值\(y\),把\(y\)扔到下标为\(x\)的set里面,然后在搜索右半边,每搜出一个状态,设他的数量差值为\(a\),价值差值\(b\),根据题意,要满足数量差值小于1,就要找左半边的状态来互补一下,很显然,如果\(n\)是偶数,数量差就一定是0,否则可以是正负1,所以要在\(set[-a]\)或\(set[-a-1],set[-a+1]\)里二分找一个数\(c\)使他加\(b\…
[返回模拟退火略解] 题目描述 今有 nnn 个数 {ai}\{a_i\}{ai​},把它们分成两堆{X},{Y}\{X\},\{Y\}{X},{Y},求一种分配使得∣∑i∈Xai−∑i∈Yai∣|\sum_{i\in X}{a_i}-\sum_{i\in Y}{a_i}|∣i∈X∑​ai​−i∈Y∑​ai​∣的值最小. Solution 3878\text{Solution 3878}Solution 3878 解法一 模拟退火SA. 尝试重新排列 aaa,将 aaa 的前半部分分成一堆,后半…
嘟嘟嘟 看数据范围,就能想到折半搜索. 但怎么搜,必须得想清楚了. 假设金币总数为1000,有20个人,首先搜前10个人,把答案记下来.然后如果在后十个人中搜到了4个人,价值为120,那么我们应该在记录的答案中的6个人中找价值最接近380的. luogu的第一篇题解写的特别好,没有用set,而是以人数为第一关键字,价值为第二关键字排序.这样保证了同一人数的金币是单调的,就可以二分查找了. #include<cstdio> #include<iostream> #include<…
题目大意:把$n(n\leqslant30)$个数分成两组,两组个数最多相差$1$,求出两组元素差的绝对值最小使多少 题解:模拟退火 卡点:$\exp$中的两个数相减写反,导致$\exp(x)$中的$x>0$,$\exp(x)>1$,相当于一直接受生成的解 C++ Code: #include <algorithm> #include <cstdio> #include <cmath> #define maxn 32 inline long long abs…
分金币(1s 128M)  coin [问题描述] 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. [输入格式] 第一行为整数n(n>=3),以下n行每行一个正整数,按逆时针顺序给出每个人拥有的金币数. [输出格式] 输出被转手金币数量的最小值. [样例输入] 4 1 2 5 4 [样例输出] 4 [样例说明] 设四个人编号为1,2,3,4.第3个人给第2个人2个金币(变成1,…
3293: [Cqoi2011]分金币 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 854  Solved: 476[Submit][Status][Discuss] Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Input 第一行为整数n(n>=3),以下n行每行一个正整数,按逆时针顺序给出每个人拥…
(解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值.比如,n=4,且4个人的金币数量分别为1,2,5,4时,只需转移4枚金币(第3个人给第2个人两枚金币,第2个人和第4个人分别给第1个人1枚金币)即可实现每人手中的金币数目相等. [输入格式] 输入包含多组数据.每组数据第一…
[BZOJ3293]分金币(贪心) 题面 BZOJ 洛谷 题解 和上一题一样啊. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ll long long #define MAX 100010 inline int read() { int x=0,t=1;char ch=getchar(); while((ch<'0'||ch>'9')&am…