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

第一题 商品分类

货架中摆放着 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. EntityFrameworkCore 模型自动更新(上)

    话题 嗯,距离上一次写博文已经过去近整整十个月,还是有一些思考,但还是变得懒惰了,心思也不再那么专注,有点耗费时间,学习也有点停滞不前,那就顺其自然,随心所欲吧,等哪天心血来潮,想写了就写写 模型自动 ...

  2. OpenFOAM 编程 | One-Dimensional Transient Heat Conduction

    0. 写在前面 本文中将对一维瞬态热传导问题进行数值求解,并基于OpenFOAM类库编写求解器.该问题参考自教科书\(^{[1]}\)示例 8.1. 1. 问题描述 一维瞬态热传导问题控制方程如下 \ ...

  3. Windows Server体验之应用兼容性按需功能

    Windows Server默认仅能支持几个有图形界面的应用包括注册表编辑器regedit.记事本notepad.任务管理器taskmgr.时间设置control timedate.cpl.区域设置c ...

  4. 基于Ubunru服务器搭建wordpress个人博客

    一.环境 服务器:阿里云突发性能实例 t5-1核(vCPU) 512 MB + 网络按流量收费(该服务器适用于小型网站) 系统:Ubuntu 22.04 64位Ubuntu  22.04 64位 二. ...

  5. 消息队列MQ核心原理全面总结(11大必会原理)

    消息队列已经逐渐成为分布式应用场景.内部通信.以及秒杀等高并发业务场景的核心手段,它具有低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 无论是 RabbitMQ.RocketMQ.Act ...

  6. 7.第六篇 二进制安装 kube-apiserver

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483812&idx=1&sn=e6773e56 ...

  7. Portainer安装,配置自定义镜像仓库拉取镜像

    Portainer介绍 Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控制台 ...

  8. 4.Gitlab CI 与 Kubernetes 的结合

    参考网址:https://www.qikqiak.com/post/gitlab-ci-k8s-cluster-feature/

  9. Java对象或String转JSON对象

    Java String转JSON对象 用阿里的fastjson里的一个方法,导入fastjson包JSONObject jsonObject1 =JSONObject.parseObject(Stri ...

  10. C#-5 类和继承

    一 类继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.继承呈现了面向对象程序设计的层次结构. 通过继承,我们能以一个已经存在的类为基础来定义一个新类.已存在的类称为基类或父类 ...