Codeforces Round #481 (Div. 3) 经典几道思维题
A - AAA
给你一颗树,支持两种操作
1.修改某一节点的权值
2.查询子树的权值(子树中节点的个数)
很显然可以用树状数组/线段树维护
B - BBB
存一下出现次数即可
int a[100], st[1100];
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n;
cin >> n;
int cnt = 0;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
st[a[i]] += 1;
}
for (int i = 1; i <= 1000; ++i) if (st[i]) cnt += 1;
cout << cnt << "\n";
int ccnt = 0;
for (int i = 1; i <= n; ++i) {
if (st[a[i]] == 1) {
cout << a[i];
ccnt += 1;
if (ccnt != cnt)cout << " ";
} else st[a[i]] -= 1;
}
}
C - CCC
两种做法,写前缀和 + 二分就找到楼层序号位置
const int N = 2e5 + 10;
ll a[N], s[N];
int n, m;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> a[i], s[i] = s[i - 1] + a[i];
while (m--) {
ll t; cin >> t;
int l = 1, r = n, cnt = 0;
while (l <= r) {
int mid = (l + r) / 2;
if (s[mid] < t) l = mid + 1, cnt = mid;
else r = mid - 1;
}
cout << cnt + 1 << " " << t - s[cnt] << "\n";
}
}
D - DDD
题意:
给你一组数,然后给你三种操作,分别是+1,-1,不变,然后判断能否通过操作将这组数变成等差数列,若能则输出最小改变次数,若不行则输出-1。
思路:
乍一看题,以为是DFS的题,使劲想怎么搜,后来搜超时了555。下面说正解,其实根据等差数列的性质,只需要处理前两项枚举所有可能结果,暴力找出最小次数即可。
const int N = 1e5 + 10, inf = 0x3f3f3f3f;
ll a[N], b[N];
int n;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n;
for (int i = 0; i < n; ++i) cin >> a[i];
int cnt = inf;
for (int i = -1; i <= 1; ++i)
for (int j = -1; j <= 1; ++j) {
b[0] = a[0] + i;
b[1] = a[1] + j;
int d = b[1] - b[0];
bool f = false;
int t = abs(i) + abs(j);
for (int r = 2; r < n; ++r) {
b[r] = b[r - 1] + d;
if (abs(b[r] - a[r]) > 1) {f = true; break;}
else {
if (b[r] != a[r]) t += 1;
}
}
if (!f) cnt = min(cnt, t);
}
if (cnt == inf) cout << "-1\n";
else cout << cnt << "\n";
}
E - EEE
题意:
给你一个含有n个整数的数组,每一个数a[i]代表汽车在站i时,车上增多了a[i]个人,如果a[i]为负,代表减少了人数。
并告诉你这个汽车的最大承载力为w个人,
请你判断初始时汽车上有多少个人,才满足整个数组的情况,。
如果某一个情况,车上的人数为负,或者人数大于w,那么说明这个数组时不合理的,。这时请输出0
思路:
可以抽象为,求这个数组的前缀和数组中的最大值和最小值,。只要最大值不大于容量,再判断下最低值的绝对值不大于容量。就可以说明是合理的。
然后可以的方案数中初始的人数一定是连续的,那么这些人数中的最大值是 \(min(w-maxsum,w)\) ,即不让过程中容量大于 \(w\) 的最大值。
最小值是 \(max(0,-1*minsum)\),然后最大值减去最小值 \(+1\) 就是答案了。
const int N = 1e3 + 10;
ll a[N], s[N];
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
ll n, m; cin >> n >> m;
ll sum = 0, Max = 0, Min = 0;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
sum += a[i];
Max = max(sum, Max);
Min = min(sum, Min);
}
if (Min < 0) Min = llabs(Min);
sum = m - Max - Min + 1;
if (sum < 0) cout << 0 << "\n";
else cout << sum << "\n";
}
F - FFF
题意:
给定 \(n\) 个人员skill值,并给出 \(k\) 个有矛盾的对,对于每个人,可以做skill值比自己小且没有矛盾人的导师。输出每一个人可做多少人的导师。
思路:
- 排序后对每个人的skill值二分查找,存储到ans[]中。
- 对于每个矛盾对,skill值大的ans减1即可。
const int N = 2e5 + 10;
ll a[N], b[N], c[N];
int n, m;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> a[i], b[i] = a[i];
while (m--) {
int x, y;
cin >> x >> y;
if (a[x] > a[y]) c[x] += 1;
else c[y] += 1;
}
sort(b + 1, b + 1 + n);
for (int i = 1; i <= n; ++i) {
int t = lower_bound(b + 1, b + 1 + n, a[i]) - b - 1;
cout << t - c[i] << " ";
}
}
G - GGG
题意:
给你N天,和M个考试,
每一个考试有三个参数。
s是考试可以开始准备的日期。
e是考试日期(这一天必须考试,不能准备)
v,这个考试需要多少天。
每一天最多只能做一件事,要么这一天休息,要么准备考试,要么参加考试。
每一个考试必须在考试之前严格的准备了v天才能通过。
请你确定你是否能能过这M个考试,
如果不可以,只需要输出-1
否则输出每一天i是做什么事情,休息是0,考试是m+1,准备是准备的那个考试编号。
思路:
贪心题,
按照每一个考试的考试日期由近到远排序。
然后枚举每一个天,1~n
如果这一天没有被使用,去检查最近1~m哪一个考试在第 i 天准备。
如果可以填就填,这样贪心搞。
const int N = 1e2 + 10;
struct node {int s, d, c, id;} p[N];
int n, m, Day[N];
bool cmp(node a, node b) {return a.d < b.d;}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
cin >> p[i].s >> p[i].d >> p[i].c;
p[i].id = i;
Day[p[i].d] = m + 1;
}
sort(p + 1, p + 1 + m, cmp);
for (int i = 1; i <= m; ++i) {
int day = 0;
for (int j = p[i].s; j <= n; ++j) {
if (Day[j] == 0) day += 1, Day[j] = p[i].id;
if (day == p[i].c) break;
if (j >= p[i].d) {
cout << -1 << "\n";
return 0;
}
}
}
for (int i = 1; i <= n; ++i) cout << Day[i] << " \n"[i == n];
}
Codeforces Round #481 (Div. 3) 经典几道思维题的更多相关文章
- Codeforces Round #353 (Div. 2) C. Money Transfers (思维题)
题目链接:http://codeforces.com/contest/675/problem/C 给你n个bank,1~n形成一个环,每个bank有一个值,但是保证所有值的和为0.有一个操作是每个相邻 ...
- Codeforces Round #380 (Div. 2)/729D Sea Battle 思维题
Galya is playing one-dimensional Sea Battle on a 1 × n grid. In this game a ships are placed on the ...
- Codeforces Round #367 (Div. 2) A. Beru-taxi (水题)
Beru-taxi 题目链接: http://codeforces.com/contest/706/problem/A Description Vasiliy lives at point (a, b ...
- Codeforces Round #575 (Div. 3) 昨天的div3 补题
Codeforces Round #575 (Div. 3) 这个div3打的太差了,心态都崩了. B. Odd Sum Segments B 题我就想了很久,这个题目我是找的奇数的个数,因为奇数想分 ...
- Codeforces Round #334 (Div. 2) A. Uncowed Forces 水题
A. Uncowed Forces Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/604/pro ...
- Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression
http://codeforces.com/contest/978/problem/D 题目大意: 给你一个长度为n的b(i)数组,你有如下操作: 对数组中的某个元素+1,+0,-1.并且这个元素只能 ...
- Codeforces Round #481 (Div. 3) G. Petya's Exams
http://codeforces.com/contest/978/problem/G 感冒是真的受不了...敲代码都没力气... 题目大意: 期末复习周,一共持续n天,有m场考试 每场考试有如下信息 ...
- Codeforces Round #481 (Div. 3) 全题解
A题,题目链接:http://codeforces.com/contest/978/problem/A 解题心得:题意就是让你将这个数列去重,重复的数只保留最右边的那个,最后按顺序打印数列.set+m ...
- Codeforces Round #481 (Div. 3) C. Letters
题目地址:http://codeforces.com/contest/978/problem/C 题解:有n个宿舍,每个宿舍人不一样多,有m封信,每封信送给对应的第m间房间,问这封信是给第几个宿舍,第 ...
- Codeforces Round #481 (Div. 3) B. File Name
题目地址:http://codeforces.com/contest/978/problem/B 题解:一串文件名里不能出现连续的xxx,询问进行几次操作后,文件名才不会出现xxx. 方法:只要遍历一 ...
随机推荐
- 【Javaweb】Servlet六 | HttpServletRequest类的含义及其使用方法【详解】
HttpServletRequest类的作用 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的Http协议信息解析好封装到Request对象中.然后传递到Service方法(d ...
- 在.net中通过自定义LoggerProvider将日志保存到数据库方法(以mysql为例)
在.NET中,Microsoft.Extensions.Logging是一个灵活的日志库,它允许你将日志信息记录到各种不同的目标,包括数据库.在这个示例中,我将详细介绍如何使用Microsoft.Ex ...
- DataGridView合并单元格,重绘后选中内容被覆盖的解决办法
DataGridView合并单元格只能进行重绘,网上基本上使用的是下面的方法: 1 /// <summary> 2 /// 说明:纵向合并单元格 3 /// 参数:dgv DataGrid ...
- VScode 中利用virtualenv建立 Python 虚拟环境
! https://zhuanlan.zhihu.com/p/638114885 VScode 建立 Python 虚拟环境 主要目的:创建一个与默认 python 版本不同的 python 虚拟环境 ...
- ij社区版如何创建spring项目
他们说是使用spring init什么什么的,那个都是老版的名称了,你去插件里面搜找是肯定搜不到的,现在叫spring boot helper,用这个,安装一下就好了(注意本次是在2022/11/1 ...
- .NET微信网页开发之网页授权获取用户基本信息
开发背景 当用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑.我们一般通过用户网页授权来无感实现用户登录,并获取用户的微信信息. 注意:用户管理类 ...
- 中企网安信息科技:基于数据化大屏的BI数据分析管理系统概述
由华企网安总公司北京中企网安信息科技有限责任公司开发的<基于数据化大屏的BI数据分析管理系统>,获得国家版权局颁发的计算机软件著作权登记证书. 基于数据化大屏的BI数据分析管理系统利用大数 ...
- 【UniApp】-uni-app-项目计算功能(苹果计算器)
前言 本文主要介绍苹果计算器项目中计算功能的实现 在前面的文章中已经实现了输入,动态计算字体大小,以及计算器的布局 本文主要介绍计算功能的实现 正文 实现/清空/改变正负/除以100 inputTex ...
- 聊聊流式数据湖Paimon(五)
从Demo入手,了解Paimon/Flink项目搭建的全过程.记录下采坑之旅. 创建Flink项目 在IDEA中创建Flink项目,由于没有Flink的archetype,因此需要手动创建一下. 参考 ...
- 【算法】Java版
二分查找算法 二分查找算法(Binary Search Algorithm)是一种在有序数组中查找特定元素的搜索算法.该算法的基本思想是将数组从中间分成两部分,然后与目标元素进行比较,进而确定目标元素 ...