AcWing第78场周赛
今天想起来了,就补一下吧~
第一题 商品分类
货架中摆放着 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场周赛的更多相关文章
- AcWing 第11场周赛题解
计算abc 首先 \(0<=a<=b<=c\) 会随机给出 \(a+b,a+c,b+c,a+b+c\)的值 因为\(a,b,c\)都为正整数,所以\(a+b+c\)一定为最大值 然后 ...
- LeetCode-第 166 场周赛
LeetCode-第 166 场周赛 1281.subtract-the-product-and-sum-of-digits-of-an-integer 1282.group-the-people-g ...
- LeetCode 第 165 场周赛
LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...
- LeetCode--第180场周赛
LeetCode--第180场周赛 1380. 矩阵中的幸运数 class Solution { public: vector<int> luckyNumbers (vector<v ...
- Leetcode第 217 场周赛(思维量比较大)
Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...
- 【AcWing】第 62 场周赛 【2022.07.30】
AcWing 4500. 三个元素 题目描述 给定一个长度为 \(n\) 的数组 \(r\_1,r\_2,-,r\_n\). 请你找到其中的三个元素 \(r\_a,r\_b,r\_c\),使得 \(r ...
- Leetcode 第133场周赛解题报告
今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...
- 第二场周赛(递归递推个人Rank赛)——题解
很高兴给大家出题,本次难度低于上一场,新生的六个题都可以直接裸递归式或者裸递推式解决,对于老生的汉诺塔3,需要找出一般式,后两题分别为裸ST算法(或线段树)/线性DP. 正确的难度顺序为 种花 角谷定 ...
- LeetCode第151场周赛(Java)
这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...
- LeetCode第152场周赛(Java)
这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...
随机推荐
- Deepin20 LNMP环境搭建(又一个瞎折腾的经历)
背景 最近头脑发热,想安装个Linux系统来办工,所以安装了Deepin20的系统,折腾了一天的LNMP的环境,记录一下瞎折腾的过程. lnmp 是一个常见的web开发的环境 nginx 如果安装过可 ...
- Windows Server体验之应用兼容性按需功能
Windows Server默认仅能支持几个有图形界面的应用包括注册表编辑器regedit.记事本notepad.任务管理器taskmgr.时间设置control timedate.cpl.区域设置c ...
- 2022CSP-J初赛游记
2022年9月16日: 下午,在学校集训,刘洋让我看了一下时间,突然发现,距离初赛就剩2天了...... 晚上,辅导班的老师对我们进行最后的培训,做了2套有道小图灵模拟题,但是做的不理想,很慌. 20 ...
- Echarts中tooltip解决显示指定数据
今天开发中遇到一个问题,echarts图表触摸x轴触发tooltip会将x轴上所有的数据展示出来,但是有些场合只需要展示某些数据就可以,并不需要全部展示,如下图: 这里警戒线因为需要开关,所以使用填充 ...
- linux软链接的创建、修改和删除
创建 ln -s [源文件或目录] [目标文件或目录] 修改 ln –snf [新的源文件或目录] [目标文件或目录] 删除 rm –rf 软链接名称 注意,上面这种形式可能会让人产生担忧,害怕删除的 ...
- Kibana可视化数据(Visualize)详解
可视化 (Visualize) 功能可以为您的 Elasticsearch 数据创建可视化控件.然后,您就可以创建仪表板将这些可视化控件整合到一起展示. Kibana 可视化控件基于 Elastics ...
- PPR的断管
1. 小管径PPR管的断管 2. 大管径PPR管的断管
- 在 Linux 上为特定的用户或用户组启用或禁用 SSH
由于你的公司标准规定,你可能只能允许部分人访问 Linux 系统.或者你可能只能够允许几个用户组中的用户访问 Linux 系统.那么如何实现这样的要求呢?最好的方法是什么呢?如何使用一个简单的方法去实 ...
- PHP全栈开发(八):CSS Ⅹ 导航栏制作
学习了这么久的CSS,我们现在也可以小试牛刀一下了,我们使用我们学会的CSS知识来制作一个导航栏. 我们都知道,在现代的导航栏里面,最普遍的就是使用无序列表来制作导航栏. 我们可以使用如下代码来制作一 ...
- flutter系列之:把box布局用出花来
目录 简介 LimitedBox SizedBox FittedBox 总结 简介 flutter中的layout有很多,基本上看layout的名字就知道这个layout到底是做什么用的.比如说这些l ...