2020.2.8铁一寒假收官赛题解

2020.2.8铁一寒假收官赛题解

  • 题目均为原题或改编,已得到题主许可
  • 出题人:Memoryヾノ战心
  • BigYellowDog选手写了份题解,得到出题人许可

T1

  • 这道题是一道很经典的简单dp模型(不会dp的可以先去自学简单入个门
  • 有O(n方)或者O(nlogn)的做法,数据范围n最大不超200,显然O(n方)算法足矣
  • 题目要求最少抽出几本书,可以转化为求最长“舒服样子”序列的元素个数w。答案即为:n-w
  • 具体思路就是定义数组dp1[], dp2[]
  • dp1[i]表示从左到右看,以第i个位置为结尾,所能构成的 最长舒服序列 的 书数量
  • dp2[i]表示从右到左看,以第i个位置为结尾,所能构成的 最长舒服序列 的 书数量
  • 转移方法如下:(下面是dp1[]的转移代码,dp2[]同理)
    for(int i=2;i<=n;i++) //枚举i的位置
      for(int j=1;j<i;j++) //枚举j的位置,显然i的上一个人必须在他左边,所以不能超过i
          if(a[i]>a[j]) //必须要i的高度>j的高度才能接上去
              dp1[i]=max(dp1[j]+1,dp1[i]); //如果执行到这里就说明i位置可以接到"以j位置为结尾的序列"上,那么"接"和"不接"俩选择,哪个好就选择哪个
  • 如何算答案?只需从1-n枚举每个位置,每个位置的最优答案是dp1[i]+dp2[i]-1(减1是因为位置i统计了两次)。那么最终答案就是(n-取n个位置的最优答案中的最大值)。
  • 感觉自己不太擅长揣测没学过dp同学的心理,所以这篇如写得不明白,还请指出。

T2

  • 算法是搜索+完全背包dp。(不会的先去自学简单入个门
  • 显然数字1卡片必须选,那么下一张选什么呢?
  • 通过观察了几组小数据我发现每次要选的数字范围为[上一个选的数+1,上一次能组成的最大面值+1]
  • 我不会严谨地证明这个结论,但并不影响做题
  • 得出每次选的数范围后,就可以搜索了。搜索思路即每次从范围中选一个数,然后与前面选的数合在一起算出一个最大面值。如果此时的最大面值>记录的最大面值,就将记录的最大面值更新为此时的最大面值。
  • 这样做估计有30分(没试过),会超时。问题出在了计算最大面值这一步上,可以用背包来优化。
  • 背包思路是定义dp[],dp[i]表示凑出i这个面值最少需要的卡片数。用完全背包模板算出dp数组,然后从1枚举到一个人为设的很大的数,如果dp[i]>n了,那么此时的最大面值就是i-1
  • 此题完全背包代码如下:
  • //虽说是模板,但建议要去找资料弄懂为什么
    memset(dp,0x3f,sizeof(dp)),dp[0]=0;
    for(int i=1;i<=fro;i++)
        for(int j=c[i];j<=c[i]*n;j++)
            dp[j]=min(dp[j],dp[j-c[i]]+1);
    for(int i=1;i<=c[fro]*n;i++)
        if(dp[i]>n) return i-1;

T3

  • 算法是逻辑分析+贪心
  • 我先简化了题意:
    • n条序列,每条序列不严格递增,花1h可以取到其中一个序列的头,对于每个序列必须按顺序取。
    • 问用n个小时最多取到的最大总价值?
  • 于是当时我就画图+手玩得出结论:答案即分别将n个小时用到每一条序列,取最优值。
  • 这很好理解,要将每个小时发挥最大的价值。显然是选择用到头的金币最大的序列。那么又因为序列越往后越大,所以在原来的江山上继续奋斗肯定比重零开始做人更优对吧
  • 严谨的证明不会

原文地址:https://www.cnblogs.com/BigYellowDog/p/12342625.html

时间: 2024-08-29 03:31:28

2020.2.8铁一寒假收官赛题解的相关文章

2016 年宁波工程学院第七届ACM校赛题解报告

2016 年宁波工程学院第七届ACM校赛题解报告 本题解代码直接为比赛代码,仅供参考. A,B,C,D,G,H,J,K,L,M 来自 Ticsmtc 同学. F 来自 Gealo 同学. E,I 来自Alex 学长. Promblem A :    Two Sum 时间限制: 1 Sec  内存限制: 64 MB 题目描述: 给出n个数,另外给出?个整数S,判断是否可以从中取出2个数,使得这两个数的和是S. 输入: 第?行有个整数T(1 <= T <= 10),代表数据组数. 对于每组数据,第

周一训练赛题解

这次完全是水题大集合啊,希望大家A的开心: 前两个题是我找的,后两个是陶叔找的,另外因为我的偷懒,下面所有的代码都是陶叔亲自写的,十分感谢陶叔: 陶叔暑假为了大家的集训,牺牲了很多自己宝贵的时间,大家接下来要好好训练啊!!!! 废话少说,进入正题: Problem A      SPOJ QUEST5 签到题: 将所有的边按照右端点排个序,然后每次选择没有钉住的点,然后把这之后的所有与它相交的边全去掉: 代码: #include <cstdio> #include <cstring>

20180909徐州网络赛题解

目录 20180909徐州网络赛题解 A. Hard to prepare MEANING SOLUTION CODE B. BE, GE or NE MEANING SOLUTION CODE F. Features Track CODE G. Trace MENING SOLUTION CODE H. Ryuji doesn't want to study MEANING CODE I. Characters with Hash CODE J. Maze Designer MEANING S

10-4国庆节第七场模拟赛题解

10-4 国庆节第七场模拟赛题解 T1工厂 (factory) 水 #include<iostream> #include<cstdio> #define int long long using namespace std; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0

10月15日模拟赛题解

10月15日模拟赛题解 A 树 Description 给定一棵 \(n\) 个节点的树,每个节点有两个参数 \(a,~b\),对于每个节点,求子树中参数为 \(b\) 的所有节点的 \(a\) 之和 Limitations \(100\%\) \(1 \leq b \leq n \leq 10^5,~a \leq 1000\) \(60\%\) \(1 \leq b,n\leq 1000\) \(30\%\) \(1 \leq b, n \leq 10\) Solution 对于 \(30\%

无聊测试赛题解

无聊测试赛题解 首先膜拜_Zhumingrui大佬获得1000分的好成绩 T1 凯撒密码 T2 积木城堡 T3 出租车拼车 T4 汽车拉力比赛 T5 最佳课题选择 T6 排行榜 T7 豪华游轮 T8 佳佳的魔法药水 T9 矩阵覆盖 待填充 T10 所陀门王的宝藏 T11 老C的键盘 待填充 T12 道路 待填充 原文地址:https://www.cnblogs.com/DannyXu/p/12536283.html

[GRYZ]寒假模拟赛

写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优(le)美(se)的文字加工后,有故事有题目有人物有奸情的模拟赛正式呈上. 我是正文 题目名 GRYZ娱乐时刻 GRYZ追击时刻 GRYZ就餐时刻 源文件 hyxzc.cpp/c/pas clikar.cpp/c/pas eat.cpp/c/pas 输入文件 hyxzc.in clikar.in ea

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],

[铁一中OI模拟赛]2017.8.20 Day2

T1 LGTB 玩扫雷 题目链接 思考: 纯模拟题,没啥说的. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) int n,m,map[1005][1005]; char s[233]; int fx[]={0,0,-1,-1,-1,0,1,1,1},fy[]={0,-1,-1,0,1,1,1,0,-1}; int main(){ //freopen(&