比赛链接

A

题意

给一个字符串每个物品对应的灯的照明方向,L/R 能照亮它左侧/右侧的所有物品(不包括自己对应的物品),现在能交换相邻两个灯一次(不改变照明方向),问能否找亮所有物品。

题解

知识点:贪心。

显然,如果存在 LRRL 就可以照亮全部,否则全是 LR 就不可行。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; bool solve() {
int n;
cin >> n;
string s;
cin >> s;
s = "?" + s;
for (int i = 1;i < n;i++) {
if (s[i] != s[i + 1]) {
if (s[i] == 'L') cout << i << '\n';
else cout << 0 << '\n';
return true;
}
}
return false;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}

B

题意

构造一组数,使得任意相邻两项之和等于全部和。

题解

知识点:构造。

\(n\) 为偶数时,构造 \(1,-1,1,-1,\cdots\) 即可。

\(n\) 为奇数时,显然奇数项和偶数项要各自相等,随后由 \(a_1+\cdots+a_n = a_{n-1}+a_{n}\) 可以得到 \((n-1)a_1+(n-3)a_2 = 0\) ,取 \(a_1 = n-3,a_2 = 1-n\) 即可,只有 \(n=3\) 时无解(因为 \(a_1 = 0\))。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; bool solve() {
int n;
cin >> n;
if (n & 1) {
if (n == 3) return false;
cout << "YES" << '\n';
for (int i = 1;i <= n;i++) {
if (i & 1) cout << n - 3 << ' ';
else cout << 1 - n << ' ';
}
cout << '\n';
}
else {
cout << "YES" << '\n';
for (int i = 1;i <= n;i++) {
if (i & 1) cout << 1 << ' ';
else cout << -1 << ' ';
}
cout << '\n';
}
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << "NO" << '\n';
}
return 0;
}

C

题意

给一组数,可以修改元素变成其相反数。问最少修改几次,可以使得第 \(m\) 个前缀和 \(a_1+\cdots+a_m\) 是所有前缀和里最小的。

题解

知识点:前缀和,数学,贪心。

定义 \(a[l,r] = a_l+\cdots+a_r\) 。

当 \(k\in [1,m-1]\) 时

\[\begin{aligned}
a[1,k] &\geq a[1,m]\\
a[1,k] &\geq a[1,k] + a[k+1,m]\\
0 &\geq a[k+1,m]
\end{aligned}
\]

当 \(k\in [m+1,n]\) 时

\[\begin{aligned}
a[1,k] &\geq a[1,m]\\
a[1,m] + a[m+1,k] &\geq a[1,m]\\
a[m+1,k] &\geq 0
\end{aligned}
\]

所以只要保证任意 \(i\in[2,m]\) ,满足 \(a[i,m]\leq 0\) ;任意 \(i\in[m+1,n]\) ,满足 \(a[m+1,i] \geq 0\) 即可。

每次操作时,贪心地取最优的即可。

时间复杂度 \(O(n\log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; int a[200007];
bool solve() {
int n, m;
cin >> n >> m;
for (int i = 1;i <= n;i++) cin >> a[i];
int cnt = 0;
multiset<int> ms;
ll sum = 0;
for (int i = m;i >= 2;i--) {
sum += a[i];
ms.insert(a[i]);
if (sum > 0) {
sum -= 2 * (*prev(ms.end()));
ms.erase(prev(ms.end()));
cnt++;
}
}
ms.clear();
sum = 0;
for (int i = m + 1;i <= n;i++) {
sum += a[i];
ms.insert(a[i]);
if (sum < 0) {
sum -= 2 * (*ms.begin());
ms.erase(ms.begin());
cnt++;
}
}
cout << cnt << '\n';
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}

D

题意

给定一组头发长度 \(a_i\) ,以及理想头发长度 \(b_i\) 。

理发师有刀片 \(x_i\) ,每个刀片只能用一次,每次可以修减一段连续区间的头发,满足 \(a'_i = \min(a_i,x),i\in[L,R]\)。

问理发师能不能通过这些刀片将 \(a\) 修剪至 \(b\) 。

题解

知识点:单调栈。

显然 \(a_i<b_i\) 无解。

利用最大值单调栈维护刀片的值。以下按顺序满足:

  1. \(b_i\) 大于栈顶刀片,则栈顶刀片因为太小不能再用了,刀片需要出栈直至 \(b_i\) 小于等于栈顶刀片或栈空。
  2. \(b_i = a_i\) ,说明 \(b_i\) 不需要修剪,什么都不用干。
  3. \(b_i \neq a_i\) ,说明 \(b_i\) 需要修剪,此时如果 \(b_i\) 小于栈顶刀片或栈空,则需要使用新的刀片,满足 \(x = b[i]\) ,如果不存在这个刀片则无解。

全部满足后,即 YES

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; int a[200007];
int b[200007];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= n;i++) cin >> b[i];
int m;
cin >> m;
map<int, int> mp;
for (int i = 1;i <= m;i++) {
int x;
cin >> x;
mp[x]++;
}
stack<int> st;
for (int i = 1;i <= n;i++) {
if (a[i] < b[i]) return false;
while (!st.empty() && b[i] > st.top()) st.pop();
if (a[i] != b[i]) {
if (st.empty() || b[i] < st.top()) {
if (mp[b[i]]) {
mp[b[i]]--;
st.push(b[i]);
}
else return false;
}
}
}
cout << "YES" << '\n';
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << "NO" << '\n';
}
return 0;
}

最新文章

  1. 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】
  2. 命令行操作svn和git和git
  3. Python中的两种列表
  4. .Net连接到SAP【转载】
  5. sql Server 触发器 调用java.
  6. SpringMVC控制器接收不了PUT提交的参数的解决方案
  7. 九度oj1163题
  8. springmvc返回枚举属性值
  9. 通过js中的useragrent来判断设备是pc端还是移动端,跳转不同的地址
  10. 强大的API测试工具Hitchhiker v0.9 基于UI的断言测试,回顾2017
  11. Go 语言类型转换
  12. apigateway-kong(二)admin-api(结合实例比官网还详细)
  13. 上次被人说TK不好咯,这次给你整个高大上的
  14. 关于 DotNetCore 的自定义权限管理
  15. ROM、RAM、CPU、CACHE、FLASH
  16. nginx-2-nginx的反向代理
  17. 43-将javaweb项目部署到Linux服务器
  18. django form 对象is_bound属性
  19. PHP 使用memcached
  20. 题目1442:A sequence of numbers(数列计算以及二分求幂运用)

热门文章

  1. 一文读懂 MySQL 索引
  2. for循环小九九乘法表
  3. springboot+thymeleaf中前台页面展示中、将不同的数字替换成不同的字符串。使用条件运算符
  4. Vue学习之--------列表渲染、v-for中key的原理、列表过滤的实现(2022/7/13)
  5. sql面试50题------(11-20)
  6. 初始Vue、Vue模板语法、数据绑定(2022/7/3)
  7. golang中的几种并发模式
  8. python3使用mutagen进行音频元数据处理
  9. FastApi学习
  10. 畅联新接入物联设备的情况:丰宝 智慧消防领域的 NB水压一体机、智能消防栓、NB液位一体机