题目大意:给定$n$个$A$类元素和$m$个$B$类元素,每类元素有值$S$和$k$个值$x_0,x_1,\dots,x_{k-1}(k\leqslant 5)$。

要求选出一个$A$类元素$a$和$B$类元素$b$,最大化$a.S+b.S+\sum\limits_{i=0}^{k-1}|a.x_i-b.x_i|$。

题解:发现$k\leqslant 5$,可以搞事情,$|a-b|=max(a-b,b-a)$,枚举每个元素的$x_i$是正是负,对每个一个状态求出在$A$和$B$中的最大值,取最大值就行了

卡点:

C++ Code:

#include <cstdio>
#include <cstring>
#define maxn 100010
const long long inf = 0x3f3f3f3f3f3f3f3f;
int Tim;
int n, m, K, U;
long long MW[1 << 5 | 3], SW[1 << 5 | 3], x[10];
long long ans;
inline long long max(long long a, long long b) {return a > b ? a : b;}
void read(int n, long long *W) {
long long tmp;
for (int i = 1; i <= n; i++) {
scanf("%lld", &tmp);
for (int j = 0; j < K; j++) scanf("%lld", x + j);
for (int j = 0; j < U; j++) {
long long tmp6 = tmp;
for (int k = 0; k < K; k++) tmp6 += (j & (1 << k)) ? x[k] : -x[k];
W[j] = max(W[j], tmp6);
}
}
}
int main() {
scanf("%d", &Tim);
while (Tim --> 0) {
scanf("%d%d%d", &n, &m, &K); ans = -inf;
U = 1 << K;
for (int i = 0; i < U; i++) MW[i] = SW[i] = -inf;
read(n, MW);
read(m, SW);
for (int i = 0; i < U; i++) {
ans = max(ans, MW[i] + SW[(U - 1) ^ i]);
}
printf("%lld\n", ans);
}
return 0;
}

最新文章

  1. cglib动态代理
  2. Python项目之我的第一个爬虫----爬取豆瓣图书网,统计图书数量
  3. php数组函数,字符串,linux命令
  4. Spring MVC的web.xml配置详解(转)
  5. WebService工作原理
  6. Testing the CATCHER_DP
  7. LNMP环境搭建(discuz论坛)
  8. 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器
  9. POJ 1698 (二分图的多重匹配)
  10. Web层框架对网站中所有异常的统一解决
  11. vue mint UI
  12. Android 性能优化概念(1)
  13. Java并发框架——AQS之如何使用AQS构建同步器
  14. UCenter通信原理
  15. 7.01-beautiful_soup2
  16. Excel 2013 表格自用技巧
  17. ubuntu 印象笔记
  18. Linux下利用backtrace追踪函数调用堆栈以及定位段错误【转】
  19. [dubbo实战] dubbo+zookeeper伪集群搭建 (转)
  20. 【linux】dpkg info修复及dpkg: warning: files list file for package

热门文章

  1. 用struct LNode *L与LinkList &amp;L的区别
  2. MySQL超大表如何提高count速度
  3. 返回固定页面的web服务器
  4. 利用python在windows环境下爬取赶集网工作信息。
  5. ubuntu中使用apt命令安装ipython失败解决方案
  6. TouTiao开源项目 分析笔记16 新闻评论
  7. Android 使用RxJava实现一个发布/订阅事件总线
  8. 从库函数操作RCC的流程来理解偏移变量
  9. easyui 获取树的平级根节点的父节点&amp;选择性展示树的一个根节点
  10. zedboard烧写SD卡启动linux镜像