23/7/6 算法每日一题
题目1:AcWing 3325.Kick_StartKsenia 非常喜欢读书,因此每天她都会从自己最喜欢的书中选取一段内容进行阅读,然后再开始她早晨的其他活动。
一段内容可以看作是整个文本中的一个子字符串。
Ksenia 有点迷信,她坚信如果阅读的这段内容是以字符串 KICK 开头,然后中间包含 0 个或更多个字符,最后以字符串 START 结尾,即使这段内容没什么意义,她的一天也会非常的幸运。
给定这本书的全部文本内容,请你数一数在这本书变得破旧不堪,Ksenia 不得不再买新书之前,共有多少个幸运片段可供她阅读。
只要两个片段的起始位置或结束位置不同,就认为这两个片段是不同的,即使它们包含的内容完全相同。
还需注意,不同片段之间可能会有重叠部分。
123456789101112131415161718192021222324252627282930313233#include<iostream>#include<string>using namespace std;int findLucky(string s){ int kick = 0, ...
23/7/5 算法每日一题
题目:AcWing 3748.递增子串的朋友约翰刚刚度假归来,他迫不及待地想要跟你分享他了解到的关于字符串的一个新性质。
他了解到,如果一个长度为 L 的大写字母构成的字符串 C,满足对于每对索引 i,j(1≤i<j≤L,索引编号 1∼L),位置 i 处的字符均小于位置 j 处的字符,则该字符串是严格递增的。
例如,字符串 ABC 和 ADF 是严格递增的,而字符串 ACC 和 FDA 则不是。
在教给你这个关于字符串的新性质后,他打算考一考你:
给定一个长度为 N 的字符串 S,请你计算对于每个位置 i(1≤i≤N),以该位置结束的最长严格递增子串的长度是多少?
123456789101112131415161718192021222324252627#include<iostream>using namespace std;const int N=2e5+10;char s[N];int main(){ int T; cin>>T; for(int t=1;t<=T;t++) { int ...
23/7/4 算法每日一题
题目:AcWing 4118.狗和猫你在动物收容所工作,负责喂养动物。
你一共准备了 D 份狗粮和 C 份猫粮。一共有 N 只动物排队等候用餐,有的是狗,有的是猫。当然,也有可能全都是狗或者全都是猫。
我们可以用一个长度为 N 的由大写字母 C 和 D 组成的字符串 S 来表示队列中猫狗的顺序。
如果队列中第 i 只动物是猫,则第 i 个字符为 C。如果队列中第 i 只动物是狗,则第 i 个字符为 D。
动物们严格按照排队顺序依次进食。每只狗吃一份狗粮,每只猫吃一份猫粮。
此外,你还有额外的猫粮。每当一条狗吃完一份狗粮,你就会为猫多提供 M 份猫粮。
每只动物都只会在排在其前面的所有动物都进食完毕后,才肯进食。这也就意味着,当轮到某只动物进食,但是却没有相应的食物时,它和排在它后面的所有动物都会因此无法进食。
请问,在这种情况下,队列中的所有狗能否都得到喂食。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include<iostream>#includ ...
23/7/3 算法每日一题
题目1:AcWing 4443.无限区域给定一个无限大的二维平面,设点 S 为该平面的中心点。
设经过点 S 的垂直方向的直线为 P,如果直线 P 是一个圆的切线,且切点恰好为点 S,那么:12如果该圆位于直线 P 的右侧,则称之为右圆。如果该圆位于直线 P 的左侧,则称之为左圆。
现在,给定三个整数 R,A,B,你需要按照右圆、左圆、右圆、左圆…的顺序不断画圆,具体要求如下:1234第一个右圆的半径等于 R。每个左圆的半径等于你画的上一个圆的半径乘以 A。每个右圆(第一个除外)的半径等于你画的上一个圆的半径除以 B(向下取整)。当你要画的圆的半径等于 0 时,绘画停止。
请你计算,所有画出的圆的面积之和。题目保证绘画会在有限数量的步骤后停止。
1234567891011121314151617181920212223242526272829303132#include<iostream>using namespace std;const double PI = 3.1415927;//画画顺序 右 左 右 左//当出现画圆半径为0的情况,则退出int main() ...
23/7/2 算法每日一题
题目1:AcWing 3321.ATM队列N 个人(编号 1∼N),排成一队在 ATM 机前准备取钱。
初始时,队列按编号升序的顺序排列。
第 i 个人需要取 Ai 元钱。一个人一次最多可以取 X 元钱。
当轮到某个人取钱时,如果其需要的钱的数量大于 X,则只能先取 X 元钱,然后去队尾重新排队,等待下次轮到他取钱时,继续去取。
当一个人取够钱时,他就会拿着钱离开队列。
现在,请你确定所有人离开队列的顺序。
代码如下
1234567891011121314151617181920212223242526272829#include <bits/stdc++.h>using namespace std;const int N=1e5+10;pair<int,int> a[N];int main(){ int t; cin>>t; for(int i=1;i<=t;i++) { printf("Case #%d: ",i); int n,x; ...
23/7/1 算法每日一题
因为期末周和放假回家休息了几天,今天开始继续
题目1:AcWing 4737.冰壶红队和黄队进行了一场冰壶比赛,比赛结束后,裁判正在计算两队的得分。
场地可以看作一个二维平面,得分区域可以看作一个以 (0,0) 为圆心 Rh 为半径的圆。
场地上散落着 N 个红队的冰壶以及 M 个黄队的冰壶。
冰壶可以看作一个半径为 Rs 的圆。
每个冰壶的圆心坐标已知。如果一个冰壶的任何部分位于得分区域的圆上或圆内(两者相切也算),则视为该冰壶位于得分区域内。如果一个冰壶能够同时满足:1231.它位于得分区域内。2.不存在任何对方冰壶比它距离得分中心 (0,0) 更近(欧几里得距离)。那么,这个冰壶就是一个得分冰壶。
一个队伍的最终得分等于该队伍的得分冰壶数量。请你计算并输出两支队伍的最终得分。
一个冰壶与得分中心之间的距离等于其圆心点到点 (0,0)的距离。
数据保证不同冰壶与得分中心之间的距离不同,且冰壶两两之间不重叠(但可能相切)。
代码如下12345678910111213141516171819202122232425262728293031323334353637383940414243 ...