485. Arrays

Time limit per test: 1.75 second(s)
Memory limit: 262144 kilobytes
input: standard
output: standard

You are given a sequence of 3· N integers (X1X2, ·s, X3· N). Create three sequences (A1A2, ·s, AN), (B1B2, ·s, BN) and (C1C2, ·s, CN) such that:

  • each of the integers from 1 to 3· N belongs to exactly one of the sequences AB or C;
  • the value of  is the largest possible.
Input

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.

Output

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.

Example(s)
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的更多相关文章

  1. Java程序员的日常—— Arrays工具类的使用

    这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...

  2. 使用 Arrays 类操作 Java 中的数组

    Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等(关于类和方法的相关内容在后面的章节中会详细讲解滴 ...

  3. 【转】java.util.Arrays.asList 的用法

    DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...

  4. System.arraycopy()和Arrays.copyOf()的区别

    先看看System.arraycopy()的声明: public static native void arraycopy(Object src,int srcPos, Object dest, in ...

  5. 计算机程序的思维逻辑 (31) - 剖析Arrays

    数组是存储多个同类型元素的基本数据结构,数组中的元素在内存连续存放,可以通过数组下标直接定位任意元素,相比我们在后续章节介绍的其他容器,效率非常高. 数组操作是计算机程序中的常见基本操作,Java中有 ...

  6. 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 ...

  7. [LeetCode] Intersection of Two Arrays II 两个数组相交之二

    Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...

  8. [LeetCode] Intersection of Two Arrays 两个数组相交

    Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...

  9. [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 ...

随机推荐

  1. GitHub中有关已建仓库及上传项目文件的删除

    上传了项目,竟然发现找不到删除的地方,真是囧... 1. 已建仓库的删除 点击 settings,进入以下界面,点击箭头指向的按钮 进入以下界面 2. 某个文件的删除 直接点开文件,在右上角有个删除工 ...

  2. v-contextmenu的使用(右键菜单)

    先来个自己改写的图: 代码: 结构:<div class="wrap" v-contextmenu:contextmenu> <v-contextmenu ref ...

  3. ROS-URDF仿真

    前言:URDF (标准化机器人描述格式),是一种用于描述机器人及其部分结构.关节.自由度等的XML格式文件. 一.首先做一个带有四个轮子的机器人底座. 1.1 新建urdf文件 在chapter4_t ...

  4. magento 翻译使用实例

    在自定义的模块中若想要使用翻译,需在config.xml中加入如下配置 <config> <adminhtml> //后台 <translate> <modu ...

  5. 如何调试ajax 和php

    ###ex11_1_main.php <html><head><meta http-equiv="Content-Type" content=&quo ...

  6. SQL Split函数,将一串字符串返回成table

    写法一: CREATE FUNCTION [dbo].[Split] ( @str VARCHAR(MAX), --传进来的字符串 ) --分割符 ) RETURNS @t TABLE --定义一个虚 ...

  7. C语言学习(2)-GTK布局

    首先了解下gtk中函数的定义格式: 记住下面几个格式看,下面的代码 声明变量:GtkAbc*abc=gtk_abc_new()声明控件; 赋值:gtk_abc_set_label(controlNam ...

  8. Spark学习之数据读取与保存(4)

    Spark学习之数据读取与保存(4) 1. 文件格式 Spark对很多种文件格式的读取和保存方式都很简单. 如文本文件的非结构化的文件,如JSON的半结构化文件,如SequenceFile结构化文件. ...

  9. 如何实现ADSL宽带用户开机自动拨号与定时拨号

    在宽带拨号网络的环境下,要通过手动拨号认证才能上网.下面给大家介绍怎么设置开机自动拨号上网以及定时拨号上网. 这也是为一个叫CHY的2B准备的技术套餐,不需要用到网上说的自动拨号软件,只要在主机上设置 ...

  10. ZENCART 二级 分类 展开

    zencart首页默认的是只显示一级分类,很多做仿牌外贸的朋友觉得只显示一级分类不好看,也不利于产品展示.怎么让zencart首页显示二级目录?下面分享给大家: 打开文件’includes/class ...