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 就全部通过...感觉我的智商被狠 ...
随机推荐
- Java 多线程:并发编程的三大特性
Java 多线程:并发编程的三大特性 作者:Grey 原文地址: 博客园:Java 多线程:并发编程的三大特性 CSDN:Java 多线程:并发编程的三大特性 可见性 所谓线程数据的可见性,指的就是内 ...
- Redis6.0.6的三大内存过期策略和八大淘汰策略
一.前言 Redis在我们日常开发中是经常用到的,Redis也是功能非常强大,可以进行缓存,还会有一些排行榜.点赞.消息队列.购物车等等:当然还有分布式锁Redisson,我们使用肯定少不了集群!小编 ...
- Spring 后置处理器【1】
Spring 后置处理器[1] 简单介绍 一句话:bean 在初始化前或初始化后的瞬间,我自己添加一些业务逻辑 bean 后置处理器类的内容 简单代码 package com.hspedu.sprin ...
- 2.1pip的安装和使用
我们都知道python有海量的第三方库或者说模块,这些库针对不同的应用,发挥不同的作用.我们在实际的项目中,或多或少的都要使用到第三方库,那么如何将他人的库加入到自己的项目中内呢? 打个电话?大哥你好 ...
- Traefik开启监控,日志,追踪需要的参数
监控 官方文档地址:https://doc.traefik.io/traefik/observability/metrics/overview/ 可以使用多种监控软件,比如Datadog,Influx ...
- mvn clean package 、mvn clean install、mvn clean deploy的区别与联系
使用的时候首选:mvn clean package mvn clean package依次执行了clean.resources.compile.testResources.testCompile.te ...
- OpenJudge 1.5.35:求出e的值
35:求出e的值 总时间限制:1000ms 内存限制:65536kB 描述 利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e . 输入 输入只有一行,该行包 ...
- Java程序设计(四)作业
要求:定义一个Java项目,项目名为"学号_姓名_题号",如:"20181101_张三_1",完成后将项目复制到桌面并压缩提交到邮箱82794085@qq.co ...
- C++面向对象编程之成员模板、模板特化、偏特化和模板模板参数
1.成员模板 理解起来就是类是模板类,他里面的成员函数又是个模板函数 上图例子:用派生类构造父类 2.模板特化 就是在类模板泛化后写特化的类,在template<>里不绑定类型,而在类后面 ...
- BinaryBombs(二进制炸弹实验)
实验介绍 使用所学知识拆除Binary Bombs来增强对程序的机器级表示.汇编语言.调试器和逆向工程等理解. Binary Bombs(二进制炸弹)是一个可执行程序,是C语言编译链接成的,包含pha ...