SGU 485 Arrays
485. Arrays
Memory limit: 262144 kilobytes
output: standard
You are given a sequence of 3· N integers (X1, X2, ·s, X3· N). Create three sequences (A1, A2, ·s, AN), (B1, B2, ·s, BN) and (C1, C2, ·s, CN) such that:
- each of the integers from 1 to 3· N belongs to exactly one of the sequences A, B or C;
- the value of
is the largest possible.
Constraints on N | Constraints on T |
---|---|
1 ≤ N ≤ 10 | 1 ≤ T ≤ 1000 |
11 ≤ N ≤ 15 | 1 ≤ T ≤ 100 |
16 ≤ N ≤ 20 | 1 ≤ T ≤ 10 |
21 ≤ N ≤ 25 | T = 1 |
The input file contains T test cases, all having the same value of N. The first line of the input file contains the integers T and N, constrained as shown in the adjacent table. Each of the following T lines describes one test case and contains 3· N integers, the members of the sequence X. All these values are in the range from 0 to 1000.
The output file should consist of T lines. Each line should contain the largest possible value of S for the corresponding test case from the input file.
sample input |
sample output |
1 2 4 1 8 2 0 5 |
46 |
Note. The maximal value is attained by taking A = (1, 3), B = (2, 5), C = (4, 6).
题意:给出一组数,将这些数分成三组,记为A,B,C,求出满足sigma[(Ai-Bi)*Ci]的最大值。
sl: 首先考虑下B ,很显然B中的元素应该是最小的N个,在考虑A,C很容易看出A,C应该是满足
A>=C的关系。
所以我们只需要枚举A,C就好了。
其中包含2个优化
优化1:在计算的过程中应满足全局平均值最小。
优化2:不等式 (ai-bi)*ci+(aj-bj)*cj - {(ai-bi)*aj+(ci-bj)*cj } >0成立 即满足:
(ci-aj)*(ai-bi-cj)>0 成立。
所以ci>aj 时 ai-bi>cj
ci<aj时 ai-bi<cj
详见代码。
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 using namespace std;
5 typedef long long LL;
6 const int maxn = 76;
7 int T, N;
8 int ans, a[maxn], va[maxn], vc[maxn];
9 bool vis[maxn];
bool test(int cur) {
for (int i=1; i<cur; ++i) {
if (abs(va[cur])>abs(vc[i]) && abs(vc[cur])<abs(va[i])-abs(a[3*N-i+1])) {
return false;
}
if (abs(va[cur])<abs(vc[i]) && abs(vc[cur])>abs(va[i])-abs(a[3*N-i+1])) {
return false;
}
}
return true;
}
void dfs(int cur, int last, int val) {
if (cur==N+1) {
ans = max(ans, val);
return;
}
for (int i=cur; i<=2*N; ++i) {
if (!vis[i]) {
vis[i] = 1;
va[cur] = a[i];
for (int j=max(last+1, i+1); j<=N*2; ++j) {
if (!vis[j]) {
vc[cur] = a[j];
vis[j] = 1;
int netVal = val+(a[i]-a[3*N-cur+1])*a[j];
if (netVal*N>ans*cur) {
if (test(cur)) {
dfs(cur+1, j, netVal);
}
}
vis[j] = 0;
}
}
vis[i] = 0;
break;
}
}
}
int main()
{
scanf ("%d%d", &T, &N);
while (T--) {
for (int i=1; i<=3*N; ++i) {
scanf ("%d", &a[i]);
a[i] = -a[i];
}
sort(a+1, a+3*N+1);
ans = 0;
dfs(1, 0, 0);
printf ("%d\n", ans);
}
return 0;
62 }
SGU 485 Arrays的更多相关文章
- Java程序员的日常—— Arrays工具类的使用
这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...
- 使用 Arrays 类操作 Java 中的数组
Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等(关于类和方法的相关内容在后面的章节中会详细讲解滴 ...
- 【转】java.util.Arrays.asList 的用法
DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...
- System.arraycopy()和Arrays.copyOf()的区别
先看看System.arraycopy()的声明: public static native void arraycopy(Object src,int srcPos, Object dest, in ...
- 计算机程序的思维逻辑 (31) - 剖析Arrays
数组是存储多个同类型元素的基本数据结构,数组中的元素在内存连续存放,可以通过数组下标直接定位任意元素,相比我们在后续章节介绍的其他容器,效率非常高. 数组操作是计算机程序中的常见基本操作,Java中有 ...
- No.004:Median of Two Sorted Arrays
问题: There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the ...
- [LeetCode] Intersection of Two Arrays II 两个数组相交之二
Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...
- [LeetCode] Intersection of Two Arrays 两个数组相交
Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...
- [LeetCode] Median of Two Sorted Arrays 两个有序数组的中位数
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
随机推荐
- Photoshop CC2019破解版
Photoshop CC2019 精简版: 链接:https://pan.baidu.com/s/1PeFrhtLHxLRXCW_vMkAZDg 提取码:q6nl Photoshop CC2019: ...
- MongoDB学习笔记~复杂条件拼接和正则的使用
在大叔lind框架里有日志组件logger,而在日志实现方式上有file,mongodb,sql,json等方式,对分布式日志处理上大叔推荐使用mongodb进行存储,除了它的高效写入,灵活的结构外, ...
- IntelliJ IDEA jrebel 实现热部署
前提是能够访问登陆Facebook,有Facebook的账号(我注册了一个) 点击:https://my.jrebel.com 用Facebook登陆 之后按要求填写信息 然后获取激活码 打开 id ...
- [ CodeForces 1063 A ] Oh Those Palindromes
\(\\\) \(Description\) 给出 \(N\) 个小写字母,将他们排成一个字符串,使得这个字符串里包含的回文串最多. \(N\le 10^5\) \(\\\) \(Solution\) ...
- 87. [NOIP2000] 乘积最大
★☆ 输入文件:cjzd.in 输出文件:cjzd.out 简单对比 时间限制:1 s 内存限制:128 MB 问题描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国 ...
- 短URL生成
算法原理 算法一 1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略 ...
- Python3.4的Pillow库实现验证码图片
转自 http://blog.csdn.net/bin381/article/details/41969493 from PIL import Image,ImageDraw, ImageFont, ...
- Java 基础入门随笔(10) JavaSE版——单例设计模式
设计模式:对问题行之有效的解决方式.其实它是一种思想. 1.单例设计模式. 解决的问题:就是可以保证一个类在内存中的对象唯一性.(单个实例) 使用单例设计模式需求:必须对于多个程序使用同一个配置信息对 ...
- 3星|《投机教父尼德霍夫的股票投机术》:2003年的书了。作者97年投机大亏后在CNBC《金钱》栏目上的股市评论文章集。
查资料作者在97年金融危机中大亏,之后在CNBC<金钱>栏目上跟人合写股市评论文章,本书是那些股评文章的集合.有资料说作者在08年有一次大亏. 从这些文章看,作者是比较冷静地看待股市的,不 ...
- Linux基础之操作系统
一.什么是操作系统 简单来说,操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 二.操作系统存在的意义 究根结底,我们日常对计算机的管理是对计算机硬件的管理.经过近百年的时间,现代 ...