20200725005909

2020杭电暑期多校02 10 - Lead of Wisdom (HDU6772) 常数坑

如果一直 TLE,就看第三章。

一、题意

物品可能的种类有 kkk 种,编号为 [1,k][1,k][1,k]。

有 nnn 件物品,第 iii 件物品属于某一种类 tit_iti​ 并拥有四个非负整数的属性值 ai,bi,ci,dia_i,b_i,c_i,d_iai​,bi​,ci​,di​。

现在,我们对每一种类最多取其中一件物品,最终得到所取出物品的集合 SSS(元素为所取物品的编号),则我们的总收获为
DMG=(100+∑i∈Sai)(100+∑i∈Sbi)(100+∑i∈Sci)(100+∑i∈Sdi)DMG = (100+\sum_{i\in S} a_i)(100+\sum_{i\in S} b_i)(100+\sum_{i\in S} c_i)(100+\sum_{i\in S} d_i) DMG=(100+i∈S∑​ai​)(100+i∈S∑​bi​)(100+i∈S∑​ci​)(100+i∈S∑​di​)
求能得到的最大收获。

样例数T≤10;样例数 T\leq 10;样例数T≤10;

n,k≤50;1≤ti≤k;0≤ai,bi,ci,di≤100;n,k\leq 50; 1\leq t_i\leq k; 0\leq a_i,b_i,c_i,d_i\leq 100;n,k≤50;1≤ti​≤k;0≤ai​,bi​,ci​,di​≤100;

注意,样例输入隐含了重要题意信息:

1
6 4
1 17 25 10 0
2 0 0 25 14
4 17 0 21 0
1 5 22 0 10
2 0 16 20 0
4 37 0 0 0

二、题解

发现数据较小,先考虑暴力搜索,下面证明其可行性。

首先,既然属性值非负,那么我们对每个种类都应取一件物品,除非这一种类不含任何物品。

当总共有 k=k0k=k_0k=k0​ 种种类时,最大复杂度是多少?设 第 iii 种有 cnticnt_icnti​ 件物品,则复杂度为 Πi=1kcnti\Pi_{i=1}^k cnt_iΠi=1k​cnti​。显然,当每种物品数量比较均衡时上述乘积达到最大。具体来说,由于每组平均有 nk\frac{n}{k}kn​ 件物品,我们可令含有 ⌈nk⌉\lceil \frac{n}{k} \rceil⌈kn​⌉ 件物品的种类数为 nmodkn\mod knmodk,其余种类含有 ⌊nk⌋\lfloor \frac{n}{k}\rfloor⌊kn​⌋ 件物品,则最为平均。

然后我们再对 k0k_0k0​ 取 [1,50][1,50][1,50] 各值,发现当种类数 k0=17k_0=17k0​=17 时复杂度最大:

则暴力搜索的单样例复杂度约 8.6∗1078.6*10^78.6∗107,总复杂度达 8.6∗1088.6*10^88.6∗108,本地电脑实测可以过。

然而,交上去却TLE,对此我们进行了各类优化:递归改为用栈循环并进一步改成手写栈、减少 long long 运算(因为在最后一步相乘得答案前,加法不会爆 int)都没用。

三、本题的坑

仔细研究样例,会发现虽然输入 k=4k=4k=4,但实际物品种类只有三种,即允许有种类是不含任何物品的(第二章也稍稍提到了)。再看官方题解和各博客,发现多次提及 cnti=0cnt_i=0cnti​=0 的种类应跳过。这便引出了此题又一个巨大的常数……

以种类数为 171717 为例,此时最坏情况有 161616 个种类含三件物品、111 个种类含两件物品。然而当输入 k=50k=50k=50 时,就会有 333333 个空的种类(不含任何物品)!把dfs过程视为一棵树,我们本应递归 171717 层访问 8.6∗1088.6*10^88.6∗108 个叶子节点(可能情况),但如果这 333333 个空种类(空递归层)造成的树链被加在了每个叶子的下方(这是最坏情况,当然这些链也可能加在中间层),就会增加 8.6∗108∗338.6*10^8*338.6∗108∗33 次递归调用(树上节点)!这只是举例,最坏情况也不一定发生在 171717 种种类时呢?没有进一步计算探究了。

解决方法很简单,每组样例只需要在dfs前花费 O(50)O(50)O(50) 遍历一遍所有种类,用链表记录非空种类,后续递归只关注链表上的种类即可。

四、AC代码

#include<cstdio>
#include<vector>
#include<algorithm>
#define ll long longint t[55], a1[55], b1[55], c1[55], d1[55];
std::vector<int> items[55];  // items[i] stores the (id of) items of the i-th type.
int next_type[55];
int last_type;ll max_ans;void dfs(int ind , int a , int b , int c , int d){if(ind==0){max_ans = std::max( max_ans , 1LL*a*b*c*d );return;}for(int i=0 ; i<items[ind].size() ; ++i){int j=items[ind][i];dfs(next_type[ind] , a+a1[j] , b+b1[j] , c+c1[j] , d+d1[j]);}
}int main(){int T;scanf("%d" , &T);while(T--){int n,k;scanf("%d%d" , &n , &k);for(int i=1 ; i<=k ; ++i) items[i].clear();for(int i=1 ; i<=n ; ++i){scanf("%d%d%d%d%d" , &t[i] , &a1[i] , &b1[i] , &c1[i] , &d1[i]);items[t[i]].push_back(i);}last_type=51;for(int i=k ; i>=1 ; --i){if(items[i].size()==0) continue;next_type[last_type]=i;last_type = i;}next_type[last_type]=0;max_ans=0;dfs(next_type[51] , 100 , 100 , 100 , 100);printf("%lld\n" , max_ans);}return 0;
}

2020杭电暑期多校02 10 - Lead of Wisdom (HDU6772) 常数坑相关推荐

  1. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第一场)

    杭电多校第一场属实恐怖,我连补题的冲动都莫得了. 本来还想说按去年的经验来说,杭电是要比牛客稍微友好那么一丢丢的吧.结果当场打脸,签到题来了个最短路*2+网络流,这谁顶得住啊. 所以这两天都没在补这场 ...

  2. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第四场)

    本来想说这场放掉了,算了还是补了吧... 以下题解包括: \[1001[HDU-6614] \\ 1003[HDU-6616] \\ 1007[HDU-6620] \\ 1008[HDU-6621] ...

  3. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第五场)

    开启疯狂水题解模式,大概会持续好几次...直到我赶上进度为止. 以下题解包括: \[1001[HDU-6624] \\ 1004[HDU-6627] \\ 1005[HDU-6628] \\ 1006 ...

  4. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第三场)

    以下题解包括: \[1002[HDU-6604] \\ 1004[HDU-6606] \\ 1006[HDU-6608] \\ 1007[HDU-6609] \\ 1009[HDU-6611]\] [ ...

  5. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第六场)

    我胡汉三又滚回来了....保质期过了的题也得记下来. 以下题解包括: \[1002[HDU-6635] \\ 1005[HDU-6638] \\ 1006[HDU-6639] \\ 1008[HDU- ...

  6. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第二场)

    这段时间自己都不知道该干些什么,比赛时候什么都想不到,全靠队友A题维持生计这样...补题进度也是一拖再拖,明后天又是两场连打,感觉又要堆一堆题了...看着补算了. 以下题解包括: \[1005[HDU ...

  7. 2020牛客暑期多校训练营(第四场)

    2020牛客暑期多校训练营(第四场) 这场属实有点难受 文章目录 A Ancient Distance B Basic Gcd Problem 题目 代码: C Count New String D ...

  8. 2020杭电计算机考研复试面试

    2020杭电计算机考研复试面试问题 20考研学渣一枚,有幸上岸,整理了下自己以及朋友复试遇到的问题 英语题目: 1.如果你想邀请以为古代名人参加你的聚会,你会选谁 2.最重要的品质,为什么 专业题: ...

  9. 2020牛客暑期多校训练营(第三场)A.Clam and Fish

    2020牛客暑期多校训练营(第三场)A.Clam and Fish 题目链接 题目描述 There is a fishing game as following: The game contains ...

最新文章

  1. 中国对计算机科学与技术人才的需求,计算机科学与技术整体概况之人才需求分析_跨考网...
  2. 制作iPhone App demo video
  3. IOS上的 Audio Memos SE 如何分享和传输录音到电脑?
  4. 用ram实现寄存器堆_纯C语言实现bootloader
  5. Python pandas模块输出每行中间省略号问题
  6. 我在微信上大学:如何正确理解指针和结构体指针?
  7. spring boo_为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!
  8. WinForm:进度条的实现(异步)
  9. 集成源码深度剖析:Fescar x Spring Cloud
  10. donotage标记、MTU及MTU不匹配问题、OSPF邻居状态记录
  11. 山寨高仿iPad难现山寨手机的辉煌
  12. 27日29个收集与各大资源网今日教程总汇!
  13. 有关EEPROM AT24C02字节写入和页写入
  14. Uni-app API
  15. 统计学---数据的误差
  16. DPU-PYNQ使用笔记
  17. Android 第三次作业 contentprovider与resolver
  18. html数学相关符号
  19. 如何解决word文档报错打不开呢?
  20. win7瘦身,关闭虚拟内存,页面文件,休眠

热门文章

  1. Python操作之MySQL
  2. 论文下载神器Sci-Hub
  3. 在ubuntu上安装和使用中文输入法的一些经历
  4. B-1.23 协议分析--I2C串联保护电阻和上拉电阻的选择
  5. STM32F4学习笔记(基础介绍篇)
  6. 无线接收信号强度(RSSI)那些事儿
  7. 企业邮箱购买指南:分享如何购买适合企业的企业邮箱
  8. Ext 图片上传及预览,兼容多中浏览器
  9. linux脚本隐藏托盘,Shell_NotifyIcon实现任意托盘图标的隐藏与再现
  10. 浅谈元数据管理之Atlas和Metacat