首页 > 其他分享 >2023.6.14每日一题

2023.6.14每日一题

时间:2023-06-14 15:57:50浏览次数:58  
标签:奇偶 14 int 每日 元素 奇偶性 2023.6 include dp

B. Garland - 1800

原题链接

Codeforces Round 612 (Div. 1) A

Codeforces Round 612 (Div. 2) C

题目大意

给定一个被删去字符的 \(1\sim n\) 排列,现在需要将空缺位置填入缺失的数,使得最终得到的序列仍是一个 \(1\sim n\) 的排列,问所有填法中,相邻两项的奇偶性不同的数对数量最小值是多少。

解题思路

注意到本题数据范围只到 \(100\),所以dp到 \(O(n^3)\) 也是可以通过的。

我们开一个四维dp数组dp[i][j][k][ok],其中最后一维仅包含01,表示我们当前位置的奇偶性,这个数组表示前 \(i\) 位元素替换 \(j\) 个偶数,\(k\) 个奇数后,当前元素奇偶性为 \(ok\) 的最小奇偶交换次数(这里的奇偶交换次数指的就是题目所说的数对数量,从头遍历到尾部发生奇偶交换就表明存在一个这样的数对)。

确定完我们的状态表示之后需要确定我们的转移方程。

注意到如果我们遍历到的位置是一个既定元素,那么这个位置的dp值是固定的,但是由于不知道给定的数组是什么样的,所以这里依旧需要对奇偶性不同的情况取最小值。反之如果遍历到的是一个空元素,那么我们需要对这个填入元素的奇偶性做出讨论,与前一个相比发生奇偶改变则对dp值加一。

最后我们的答案是对两种结尾奇偶性取小者,前三维一定是 dp[n][remain(even)][remain(odd)],也就是数组前 \(n\) 个元素,恰好用掉可用的所有偶数和奇数的情况下,最小奇偶交换次数。

因为我们不需要考虑具体值,只需要在意奇偶性,所以题目所说的 \(1\sim n\) 的排列是一定可以得到满足的,可以忽略这个限制。

AC Code

#include <iostream>
#include <algorithm>
#include <cstring>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;
typedef long long LL;

const int N = 110;
const int MOD = 1e9 + 7;

int a[N];
int dp[N][N][N][2];

void solve() {
    int n;
    cin >> n;
    int cnt1 = (n + 1) / 2, cnt2 = n / 2;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (a[i] & 1) {
            cnt1--;
        } else if (a[i]){
            cnt2--;
        }
    }
    memset(dp, 0x3f, sizeof dp);
    if (a[1]) {
        dp[1][0][0][a[1] & 1] = 0;
    } else {
        dp[1][1][0][0] = 0;
        dp[1][0][1][1] = 0;
    }
    for (int i = 2; i <= n; i++) {
        for (int j = 0; j <= i; j++) {
            for (int k = 0; k <= i - j; k++) {
                if (a[i]) {
                    dp[i][j][k][a[i] & 1] = min(dp[i - 1][j][k][0] + (a[i] & 1), dp[i - 1][j][k][1] + (1 - (a[i] & 1)));
                } else {
                    dp[i][j][k][0] = min(dp[i - 1][j - 1][k][0], dp[i - 1][j - 1][k][1] + 1);
                    dp[i][j][k][1] = min(dp[i - 1][j][k - 1][0] + 1, dp[i - 1][j][k - 1][1]);
                }
            }
        }
    }
    cout << min(dp[n][cnt2][cnt1][0], dp[n][cnt2][cnt1][1]) << endl;
}

signed main() {
    ios;
    int T = 1;
//    cin >> T;
    while (T--) {
        solve();
    }
}

标签:奇偶,14,int,每日,元素,奇偶性,2023.6,include,dp
From: https://www.cnblogs.com/SanCai-Newbie/p/17480484.html

相关文章

  • 2023-06-14 记录一下vue组件如何调用App.vue里面的方法(代码来至chatGpt)
    可以通过在子组件中使用$emit方法来触发App.vue中的方法。具体步骤如下:在App.vue中定义一个方法<script>exportdefault{methods:{appMethod(){console.log('调用了App.vue中的方法')}}}</script>在子组件中使用$emit方法触发该方......
  • 【题解】[JLOI2014]镜面通道
    题目描述:在一个二维平面上,有一个镜面通道,由镜面\(AC,BD\)组成,\(AC,BD\)长度相等,且都平行于\(x\)轴,\(B\)位于\((0,0)\)。通道中有\(n\)个外表面为镜面的光学元件,光学元件\(\alpha\)为圆形,光学元件\(\beta\)为矩形(这些元件可以与其他元件和通道有交集,具体看下图)。......
  • 系统架构设计师笔记第14期:系统分析与设计
    面向对象的方法面向对象方法(Object-orientedmethods)是一种软件开发方法,其核心思想是将软件系统建模为对象的集合,这些对象之间通过消息传递进行交互。面向对象方法强调对象的概念、封装、继承和多态等特性,以实现软件系统的可重用性、可维护性和灵活性。以下是面向对象方法的一些关......
  • W25Q32-2023-06-14
    1、W25Q内部结构图截取自《[9-3]53W25QXX介绍》视频13:44的地方,对比起来,页、扇区和块之间的关系相比“W25Q32共32M-bit(4MB字节),它可划分为64块,每块64KB,每块又可划分为16个扇区,每个扇区4KB,每个扇区又可划分16页,每页256B”这样的描述更为清晰,而手册里结构图的问题在于普遍都是采用......
  • 【230614-1】已知在三角形ABC中,有A+B=3C,且2Sin(A-C)=SinB 求:(1)SinA (2)AB=5,求AB上
    【题目】已知在三角形ABC中,有A+B=3C,且2Sin(A-C)=SinB 求:(1)SinA (2)AB=5,求AB上的高?(23年高考数学新一卷17题)......
  • 深度学习应用篇-元学习[14]:基于优化的元学习-MAML模型、LEO模型、Reptile模型
    深度学习应用篇-元学习[14]:基于优化的元学习-MAML模型、LEO模型、Reptile模型1.Model-AgnosticMeta-LearningModel-AgnosticMeta-Learning(MAML):与模型无关的元学习,可兼容于任何一种采用梯度下降算法的模型。MAML通过少量的数据寻找一个合适的初始值范围,从而改变梯度下降......
  • C/C++《程序设计课程设计》[2023-06-14]
    C/C++《程序设计课程设计》[2023-06-14]《程序设计课程设计》指导书程序设计课程设计说明书一、设计任务与要求《程序设计课程设计》是在完成《程序设计基础》课程学习后进行的一门专业实践课程,是培养学生综合运用所学知识解决专业相关问题的重要环节,是对学生实际工作能力的......
  • 6-14|gitlab的runner的流水线怎么看
    要查看GitLab的Runner的流水线,可以按照以下步骤操作:1.进入GitLab的项目页面,选择“CI/CD”选项卡。2.在“Pipelines”选项卡下,在顶部的搜索框中输入Runner名称或者RunnerID,筛选出该Runner对应的流水线。3.点击该流水线的ID,进入该流水线的详情页面。4.在流水线详情页面,可以......
  • 1814.统计一个数组中好对子的数目
    问题描述1814.统计一个数组中好对子的数目解题思路首先,变换一下题目的需求,nums[i]-rev(nums[i])==nums[j]-rev(nums[j]),然后利用哈希表记录每个值出现了多少次就可以了。代码classSolution{public:intrev(intnum){vector<int>tmp;inta......
  • 【每日一题】Problem 120F. Spiders
    原题解决思路通过给定的数据,将其构建称树,取其中最大的深度进行拼接,最后得到最终结果如何获取最大的深度以每个节点作为root构建树,然后取其中最大的深度#include<bits/stdc++.h>/***@paramvec*@paramcur当前节点*@paramlast上一个访问的节点*@param......