树木规划

这个没啥好说的,暴力就完事儿了。
好叭还是简单说说。
要删除最少的元素,反过来,我们就要保留尽可能多的元素。对于一个元素x,保证合法的情况下,他的下一个元素就应该在x+d及其以后,这样,对于一个位置x,我们可以得到最长的包含x的合法序列长度。

例如d=2 树的位置{1,2,3,5,6}。那么包含1的最长合法序列就是1 3 5,并且后续不用再次遍历1 3 5这三个元素了,所以将它标记掉。

总复杂度o(nlogn)

class Solution {public:int n,vis[100010]={0},ans=0;int treePlanning(vector<int> &trees, int d) {n=trees.size();for(int i=0;i<n;i++){if(vis[i]==1)continue;int num=0;int si=i;while(si<n)//从i开始,每次找最小的合法位置{si=lower_bound(trees.begin(),trees.end(),trees[si]+d)-trees.begin();//二分查找最小的合法位置vis[si]=1;//标记掉这个位置num++;//序列长度加一}ans=max(num,ans);//更新答案}return n-ans;}
};

正三角形拼接

简单来说,需要使得某个数字的出现次数>=3。
如果存在数字x出现次数>=3,答案为0 。
如果存在数字x出现两次,并且存在一个比x大的数字,那直接把大的数字分割出一个x即可。答案为1 。
如果存在数字x出现一次,并且存在数字x*2,那把大的分割一次就可以分割出两个x。答案为1 。
剩下的情况下,最多两次就可以分割出3个相同的数字。

按照上述顺序,map标记判断即可。
总复杂度o(nlogn)

class Solution {public:
#define all(x) (x).begin(),(x).end()int makeEquilateralTriangle(vector<int> &lengths) {sort(all(lengths));map<int,int> vis;for(int i:lengths)vis[i]++;//标记每个长度的出现次数lengths.resize(unique(all(lengths))-lengths.begin());//去重,更新sizeint n=lengths.size();for(int i=0;i<n;i++)if(vis[lengths[i]]>=3)return 0;for(int i=0;i<n;i++)if((vis[lengths[i]]>=2&&i!=n-1)||(vis[lengths[i]]>=1&&vis[lengths[i]*2]>=1))return 1;return 2;}
};

大楼间穿梭

这题的“高”竟然是>=的意思,卡的我一度怀疑人生。
容易发现“右边第一个比自己大的数字”是单调栈的经典模型,并且每个点p的花费都是左边能到p的点q的花费+q到p转移过程的花费,由此可以推出dp转移式。

设dp[i]为到i为止的跳跃最小花费。
dp[i]=min(dp[i-1],dp[i-2])+y
dp[i]=min(dp[右边第一个比自己大的点是i的点])+x

例如{3 2 1 5},5可以通过y的花费由1和2转移过来。同时5也可以通过花费x由3 2 1转移过来。
所以通过单调栈处理出每个位置的右边,第一个比自己大的元素位置,然后dp转移一下即可。

总复杂度o(n)
(忽略我直接全部开的longlong

class Solution {public:long long b[200010],dp[200010];vector<long long> v[200010];long long shuttleInBuildings(vector<int> &heights, int k, int x, int y) {long long n=heights.size();for(long long i=0; i<=n; i++)b[i]=n+1,dp[i]=1e18;//初始化stack<long long> Q;for(long long i=0; i<n; i++){while(!Q.empty()&&heights[Q.top()]<=heights[i])//维护一个单调递减的序列。q.top第一次遇见了一个比自己大的元素。{b[Q.top()]=i;//q.top的右边第一个比自己大的元素的下标为iQ.pop();}Q.push(i);}for(long long i=0; i<n; i++)if(b[i]-i<=k)v[b[i]].push_back(i);//存下能到达b[i]的位置有哪些。dp[0]=0;//到达起点的花费为0for(long long i=1;i<n;i++){for(long long j:v[i])dp[i]=min(dp[i],dp[j]+x);//遍历所有右边第一个比自己大的元素是i的位置,更新答案dp[i]=min(dp[i],dp[i-1]+y);//前一个位置通过花费y转移if(i-2>=0)//判越界dp[i]=min(dp[i],dp[i-2]+y);}return dp[n-1];}
};

对称前后缀

3e3的范围,明显是n^2的做法。
暴力方法的话,枚举起点和终点,然后遍历中间的子串,就可以得到答案。但是这种n^3的方法显然没法通过这道题。

可以枚举中间点,往两边扩展,并且标记这个中间点到目前为止有没有失去匹配过,如果没有失去匹配过,那这个串的贡献就是整个串的长度(回文串前缀后缀完全匹配),否则就为整个串匹配长度的一半。

比如对于串“1 2 3 4 3 5 1” ,以从4开始往两边扩展举例。
假如两个位置对应相同,则前缀和后缀匹配个数就会+1。
(1)4的时候,没有失配过,串为回文串,所以匹配长度为整个子串长度1。
(2)3 4 3的时候,没有失配过,串为回文串,所以匹配长度为整个子串的长度3
(3)2 3 4 3 5时,2!=5,失配,重置匹配长度为0。
(4)1 2 3 4 3 5 1时,1=1,匹配长度+1,并且因为失配过,所以这个串不是回文串,匹配长度为1。

总复杂度o(n^2)

class Solution {public:long long suffixQuery(string &s) {long long ans=0;for(int i=0;i<s.size();i++){int l=i,r=i+1,f=0;long long num=0;while(l>=0&&r<s.size())//以i和i+1的中间空位为中心{num++;if(s[l]==s[r]){if(f==0)ans+=num*2;elseans+=num;}else{f=1;num=0;}l--;r++;}l=i,r=i,f=0;num=0;while(l>=0&&r<s.size())以i为中心{num++;if(s[l]==s[r]){if(f==0)ans+=num*2-1;elseans+=num;}else{f=1;num=0;}l--;r++;}} return ans;}
};

2020超级码力初赛一题解相关推荐

  1. 超级码力在线编程大赛初赛第1场-1-树木规划题解

    目录 题目描述 示例 输入 输出 说明 分析 代码 动规 贪心 其他题目 题目描述 在一条直的马路上,有n棵树,每棵树有一个坐标,代表它们距离马路起点的距离. 如果每相邻的两棵树之间的间隔不小于d,那 ...

  2. 超级码力在线编程大赛初赛 第2场 题解

    超级码力在线编程大赛初赛 第2场 题解 题目出的对退役老年选手很友好,拿个T恤跑路- 下面的题解仅代表个人观点,出了问题,概不负责. 比赛链接:https://tianchi.aliyun.com/o ...

  3. 超级码力在线编程大赛初赛 第2场 1.三角魔法

    超级码力在线编程大赛初赛 第2场 1.三角魔法 题目链接 描述 小栖必须在一个三角形中才能施展魔法,现在他知道自己的坐标和三个点的坐标,他想知道他能否施展魔法 −1e9≤xi,yi≤1e9-1e9\l ...

  4. 超级码力在线编程大赛初赛 第3场 1.最大公倍数

    超级码力在线编程大赛初赛 第3场 1.最大公倍数 题目链接 描述 小栖有一个区间,他准备从中取三个数,他想知道如何取才能使得它们的最小公倍数最大 请直接告诉小栖最小公倍数是多少. 示例 输入: a = ...

  5. 超级码力在线编程大赛初赛 第2场 【题解】

    三角魔法 思路 1.利用叉乘判断点是否在直线的逆时针方向 2.如果点是在三条边的逆时针方向,则点在三角形内. 3.坑点:判断三点是否形成三角形,也是利用叉乘判断. AC代码 class Solutio ...

  6. 超级码力在线编程大赛初赛 第2场 T1-T4题解

    文章目录 T3.五字回文 T2.区间异或 T1.三角魔法 T4.小栖的金字塔 T3.五字回文 class Solution {public:/*** @param s: The given strin ...

  7. [Python3] 超级码力在线编程大赛初赛 第2场 题解

    P1 三角魔法 描述 小栖必须在一个三角形中才能施展魔法,现在他知道自己的坐标和三个点的坐标,他想知道他能否施展魔法 点在边上也属于三角形内 −109<=x,y<=109-10^{9}&l ...

  8. 阿里云 超级码力在线编程大赛初赛 第3场 题目2. 房屋染色(DP)

    文章目录 1. 题目 2. 解题 1. 题目 有n个房子在一列直线上,现在Bob需要给房屋染色,共有k种颜色. 每个房屋染不同的颜色费用也不同,Bob希望有一种染色方案使得相邻的房屋颜色不同. 但Bo ...

  9. 阿里云 超级码力在线编程大赛初赛 第2场 题目4. 小栖的金字塔(超级卡特兰数+除法求模/乘法逆元)

    文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683739284070 2. 解题 按道 ...

最新文章

  1. Yolov4性能分析(上)
  2. 10年后的计算机会是怎样的?
  3. 搭建LAMP环境示例
  4. VTK:网格之Triangulate
  5. 自动控制matlab实验,自动控制matlab实验.doc
  6. 基于ASP.NET MVC的ABP框架入门学习教程
  7. mysql 算子 谓词_[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式
  8. 论文浅尝|简单高效的知识图谱表示学习负样本采样方法
  9. Scala 深入浅出实战经典 第81讲:Scala中List的构造是的类型约束逆变、协变、下界详解...
  10. 剑指Offer之复杂链表的复制
  11. 关于各种算法以及好的blog的整理(持续更新)
  12. 沈逸老师PHP魔鬼特训笔记(3)
  13. 解决被西刺代理封ip的问题
  14. java注册功能实现
  15. 若干排序算法简单汇总(一)
  16. wps改照片底色有红边_Excel怎么给证件照换底色?Excel中快速将证件照蓝底换红底的方法介绍...
  17. 第七讲:专注创造现实 第八讲:专注感激 第九讲:感激改变
  18. 软件接口设计 六大原则
  19. 帝国理工学院计算机博士,帝国理工大学博士:从0到1,一位博士生的蜕变之路...
  20. 爬虫神器Selenium傻瓜教程,看了直呼牛掰

热门文章

  1. C++成长之路(03)
  2. 不要把网站推广做成负面推广
  3. 15个理由告诉你,为何众多企业都在使用RPA
  4. tcpdump抓两个网卡的包_软路由 tcpdump抓包详解: 网口详解、抓包详解、多网卡同时抓包...
  5. 关于最近用于细粒度车辆分类的深度学习框架的系统评估
  6. String s1 = new String(hello); String s2 = hello;的区别
  7. Eclipse中的add import与organize imports有什么区别
  8. Java理解抽象类与接口游戏人物简单案例
  9. 分享给大家一些优秀的网站简历模板
  10. 电商宝SCRM微信多公众号聚合客服系统可以解决哪些痛点?