今天想起来了,就补一下吧~

第一题 商品分类

货架中摆放着 n 件商品,每件商品都有两个属性:名称和产地。

当且仅当两件商品的名称和产地都相同时,两件商品才视为同一种商品。

请你统计,货架中一共有多少种不同的商品。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含两个字符串,分别表示一件商品的名称和产地。

输入字符串的长度范围为 [1,10],且仅包含小写字母。

输出格式

一个整数,表示商品种类数量。

数据范围

前 4 个测试点满足 1≤n≤5。

所有测试点满足 1≤n≤100。

输入样例1:

5

b y

m r

b y

m y

m g

输出样例1:

4

输入样例2:

3

abc def

abc def

abc def

输出样例2:

1


#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct C
{
string a,b;
}C[N];
int ans,n;
int main()
{
cin>>n;
ans=n;
for (int i=0;i<n;i++)
{
string a,b;
cin>>a>>b;
C[i].a=a,C[i].b=b;
for (int j=0;j<i;j++)
{
if (C[j].a==C[i].a&&C[j].b==C[i].b)
{
ans--;
break;
}
}
}
ans=max(1,ans);
cout<<ans<<endl;
return 0;
}

第二题字符串

给定一个由小写字母构成的字符串 s。

如果字符串中存在两个字母相同且相邻,则称它们为相同连续字母对。

我们不希望 s 中存在相同连续字母对。

所以,每当在 s 中发现一个相同连续字母对时,就应当将这对字母从 s 中删除,如果删除某一对后,出现了新的相同连续字母对,则新的对也应当被删除。

总之,最终得到的字符串中不能存在相同连续字母对。

输出最终得到的字符串。

可以证明,不论按何种顺序删除相同连续字母对,最终得到的字符串都是一样的。

输入格式

共一行,一个由小写字母构成的字符串 s。

输出格式

输出最终得到的字符串。

保证结果不为空。

数据范围

前 5 个测试点满足 1≤|s|≤20。

所有测试点满足 1≤|s|≤2×105。

输入样例1:

aabbcddddefggbbaa

输出样例1:

cef

输入样例2:

abcddcef

输出样例2:

abef

输入样例3:

abacabaabacabaa

输出样例3:

a


方法一:栈的思想,代码简洁

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int main()
{
string s,ans;
cin>>s;
for (auto c:s)
if (ans.size()&&ans.back()==c) ans.pop_back();
else ans+=c; cout<<ans<<endl;
return 0;
}

双指针算法(比赛中只想到这么写了,简单但代码长些)

#include <bits/stdc++.h>
using namespace std;
const int N = 2*100010;
string ans;
int main()
{
string s;
cin>>s;
for (int i=0,j=1;i<s.size();)
{
if (s[i]==s[j])
{
i+=2,j+=2;
while (s[i]==ans.back())
{
ans.pop_back();
i++,j++;
}
}
else
{
ans.push_back(s[i]);
i++,j++;
}
}
cout<<ans<<endl;
return 0;
}

第三题排队

n 个小朋友排成一排,从左到右依次编号为 1∼n。

第 i 个小朋友的身高为 hi。

虽然队伍已经排好,但是小朋友们对此并不完全满意。

对于一个小朋友来说,如果存在其他小朋友身高比他更矮,却站在他右侧的情况,该小朋友就会感到不满。

每个小朋友的不满程度都可以量化计算,具体来说,对于第 i 个小朋友:

如果存在比他更矮且在他右侧的小朋友,那么他的不满值等于其中最靠右的那个小朋友与他之间的小朋友数量。

如果不存在比他更矮且在他右侧的小朋友,那么他的不满值为 −1。

请你计算并输出每个小朋友的不满值。

注意,第 1 个小朋友和第 2 个小朋友之间的小朋友数量为 0,第 1 个小朋友和第 4 个小朋友之间的小朋友数量为 2。

输入格式

第一行包含整数 n。

第二行包含 n 个整数 h1,h2,…,hn。

输出格式

共一行,输出 n 个整数,第 i 个整数为第 i 个小朋友的不满值。

数据范围

前 5 个测试点满足 2≤n≤5。

所有测试点满足 2≤n≤105,1≤hi≤109。

输入样例1:

6

10 8 5 3 50 45

输出样例1:

2 1 0 -1 0 -1

输入样例2:

7

10 4 6 3 2 8 15

输出样例2:

4 2 1 0 -1 -1 -1

输入样例3:

5

10 3 1 10 11

输出样例3:

1 0 -1 -1 -1


方法一:构建后缀数组,再用二分找到数组中小于当前数的最右边的位置

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int h[N],f[N];
int n;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&h[i]); f[n]=h[n]; // 最后一个位置初始化
// 从后往前更新第i个位置右侧中比h[i]最小的数,此时的f是非严格单调递增的
for (int i=n-1;i;i--) f[i]=min(h[i],f[i+1]);
// 对每个小孩的位置进行求解
for (int i=1;i<=n;i++)
{
int l=i,r=n;
while (l<r)
{
int mid = l+r+1>>1;
if (f[mid]<h[i]) l=mid;
else r=mid-1;
}
printf("%d ",r-i-1);
}
return 0;
}

方法二:单调栈的思想,再加二分。感觉更简洁些

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int a[N],s[N];
int n;
int top=-1;
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
while (top>=0&&a[s[top]]>=a[i]) top--; // 只要栈不为空且栈顶元素大于等于新的元素,就出栈 s[++top]=i; // 注意:栈中存储的是元素下标,这是便于后面通过下标对应原数组的元素
}
// 至此,栈中的元素是严格单调递增的,可以二分了。
for (int i=0;i<n;i++)
{
int l=0,r=top; // 左边界为栈底,右边界为栈顶。目的是寻找小于当前元素的最右侧的元素的位置
while (l<r)
{
int mid =l+r+1>>1;
if (a[s[mid]]>=a[i]) r=mid-1;
else l=mid;
}
// 这里需要特判一下,也就是这个位置是在当前元素右侧的,且这个元素是一定小于当前元素的,才会输出两个元素位置之间的元素个数
if (s[r]>i&&a[s[r]]<a[i]) printf("%d ",s[r]-i-1);
else printf("-1 ");
}
return 0;
}

总结

单调栈和单调队列还是用的不少的,得多加练习,孰能生巧。另外,这几次的比赛感觉双指针真香hhh

AcWing第78场周赛的更多相关文章

  1. AcWing 第11场周赛题解

    计算abc 首先 \(0<=a<=b<=c\) 会随机给出 \(a+b,a+c,b+c,a+b+c\)的值 因为\(a,b,c\)都为正整数,所以\(a+b+c\)一定为最大值 然后 ...

  2. LeetCode-第 166 场周赛

    LeetCode-第 166 场周赛 1281.subtract-the-product-and-sum-of-digits-of-an-integer 1282.group-the-people-g ...

  3. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  4. LeetCode--第180场周赛

    LeetCode--第180场周赛 1380. 矩阵中的幸运数 class Solution { public: vector<int> luckyNumbers (vector<v ...

  5. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  6. 【AcWing】第 62 场周赛 【2022.07.30】

    AcWing 4500. 三个元素 题目描述 给定一个长度为 \(n\) 的数组 \(r\_1,r\_2,-,r\_n\). 请你找到其中的三个元素 \(r\_a,r\_b,r\_c\),使得 \(r ...

  7. Leetcode 第133场周赛解题报告

    今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...

  8. 第二场周赛(递归递推个人Rank赛)——题解

    很高兴给大家出题,本次难度低于上一场,新生的六个题都可以直接裸递归式或者裸递推式解决,对于老生的汉诺塔3,需要找出一般式,后两题分别为裸ST算法(或线段树)/线性DP. 正确的难度顺序为 种花 角谷定 ...

  9. LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...

  10. LeetCode第152场周赛(Java)

    这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...

随机推荐

  1. 【读书笔记】C#高级编程 第八章 委托、lambda表达式和事件

    (一)引用方法 委托是寻址方法的.NET版本.委托是类型安全的类,它定义了返回类型和参数的类型.委托不仅包含对方法的引用,也可以包含对多个方法的引用. Lambda表达式与委托直接相关.当参数是委托类 ...

  2. C++ 调用 Python(通过Boost.Python)

    本文将用一个小的示例来展示如何通过Boost.Python 来实现 C++/Python 混合编程从而将两种语言的优势整合到一起. 1. CMakeLists.txt cmake_minimum_re ...

  3. kettle通过SSH连接Mysql数据库(SSH隧道)

    kettle通过SSH连接Mysql数据库(SSH隧道) Kettle无法直接连接使用SSH通道的MySQL,通过SSH隧道(推荐)或者需要借助工具PuTTY(不用时需要注销不推荐),具体操作如下所示 ...

  4. 《Java基础——循环语句》

    Java基础--循环语句       1. while语句: 规则: 1. 首先计算表达式的值. 2. 若表达式为真,则执行循环语法,直至表达式为假,循环结束.   格式: while(表达式) 语句 ...

  5. AOP实现系统告警

    工作群里的消息怕过于安静,又怕过于频繁 一.业务背景 在开发的过程中会遇到各种各样的开发问题,服务器宕机.网络抖动.代码本身的bug等等.针对代码的bug,我们可以提前预支,通过发送告警信息来警示我们 ...

  6. (三)JPA - EntityManager的使用

    (二)JPA 连接工厂.主键生成策略.DDL自动更新 建议在需要使用时,看看之前的文章,先把环境搭起来. 4.EntityManager EntityManager 是完成持久化操作的核心对象. En ...

  7. C#实现登录某web进而获取其token数据

    实习在学C#,记录一下学习过程! 首先是需求描述(基于C#的.net core MVC实现): User: Resource Owner Agent:Brower auth.brightspace.c ...

  8. 谣言检测(DUCK)《DUCK: Rumour Detection on Social Media by Modelling User and Comment Propagation Networks》

    论文信息 论文标题:DUCK: Rumour Detection on Social Media by Modelling User and Comment Propagation Networks论 ...

  9. 9.MongoDB系列之创建副本集(二)

    1. 如何设计副本集 大多数:选取主节点时需要由大多数决定,主节点只有在得到大多数支持时才能继续作为主节点,写操作被复制到大多数成员时就是安全的写操作.这里的大多数定义为"副本集中一半以上的 ...

  10. 1.RabbitMQ系列之服务启动

    1. docker方式启动MQ # latest RabbitMQ 3.10 docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:156 ...