【ETOJ P1023】同鱼系 题解(数学+取余)

2024-04-22 22:36

本文主要是介绍【ETOJ P1023】同鱼系 题解(数学+取余),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

给定一个大小为 n n n 的数组 a a a 和一个整数 k k k

你可以执行以下操作任意次(0次也行):

选择一个下标 i i i 满足 1 ≤ i ≤ n − k 1 \leq i \leq n-k 1ink,然后交换 a i a_i ai a i + k a_{i+k} ai+k

问是否可以使得数组变为非降序。

输入格式

第一行两个整数 n , k n, k n,k。( 1 ≤ n ≤ 1 0 5 , 1 ≤ k ≤ n − 1 1 \leq n \leq 10^5, 1 \leq k \leq n-1 1n105,1kn1)

接下来一行 n n n 个整数,表示 a i a_i ai。( 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109)。

输出格式

如果可以,输出"Yes",否则输出"No"。(输出不包含引号)

样例输入1

5 2
3 4 1 3 4

样例输出1

Yes

样例输入2

5 3
3 4 1 3 4

样例输出2

No

思路

将数组 a a a的元素按照下标模 k k k的值分组,然后在每一组中按照元素的值排序。如果所有的元素都满足非降序的条件,那么就意味着可以通过交换操作使得数组变为非降序。这是因为在每一组中,元素的下标之差都是 k k k,所以可以通过交换操作改变它们的相对位置。

首先,定义了一个优先队列的数组hmin,数组的大小为 N N N,其中 N N N是一个大于 n n n的常数。优先队列hmin[i]用于存储所有下标模 k k k等于 i i i的元素。

然后,从输入中读取 n n n k k k的值,接着读取数组 a a a的元素。对于每一个读入的元素 t t t,将其放入优先队列hmin[i % k]中,其中 i i i是当前元素的下标。

接着,定义了一个变量prev用于存储上一个取出的元素,以及一个标志变量flg用于标记是否所有的元素都满足非降序的条件。

然后,遍历数组 a a a的每一个元素。对于下标为 i i i的元素,从优先队列hmin[i % k]中取出最小的元素,然后检查这个元素是否大于等于prev。如果不是,那么将flg设置为 0 0 0,并且立即停止遍历。否则,将这个元素赋值给prev,然后继续遍历。

最后,如果flg的值仍然为 1 1 1,那么输出"Yes",表示可以通过交换操作使得数组变为非降序。否则,输出"No",表示无法通过交换操作使得数组变为非降序。


AC代码

#include <iostream>
#include <queue>
#define AUTHOR "HEX9CF"
using namespace std;const int N = 1e5 + 7;priority_queue<int, vector<int>, greater<int>> hmin[N];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n, k;cin >> n >> k;for (int i = 0; i <= n; i++) {int t;cin >> t;hmin[i % k].push(t);}int prev;bool flg = 1;for (int i = 0; i <= n; i++) {int t = hmin[i % k].top();hmin[i % k].pop();if (i && t < prev) {flg = 0;break;}prev = t;}if (flg) {cout << "Yes" << endl;} else {cout << "No" << endl;}return 0;
}

这篇关于【ETOJ P1023】同鱼系 题解(数学+取余)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/927049

相关文章

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析