CF1833 A-E

news2024/11/17 17:52:37

A题

题目链接:https://codeforces.com/problemset/problem/1833/A

基本思路:for循环遍历字符串s,依次截取字符串s的子串str,并保存到集合中,最后输出集合内元素的数目即可

AC代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
typedef long long ll;
typedef long double db;
void solve()
{
    set<string>st;
    int n;
    cin >> n;
    string s;
    cin >> s;
    for (int i = 0; i < n - 1; i++)
    {
        string str = s.substr(i, 2);
        st.insert(str);
    }
    cout << st.size() << endl;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

 B题

题目链接:https://codeforces.com/problemset/problem/1833/B

 基本思路:可以使用结构体与快速排序来解题。第一,用结构体p来存储数组a和其对应的原始位置id,并为数组b预留出变量c这个位置。第二,先对结构体进行排序,若a的值相同则id小的排在前面。第三,对数组b进行排序。第四,讲排序后的数组b的值依次赋值给结构体中的变量c。最后,将结构体根据id恢复其原来的排序,最后使用for循环遍历,依次输出c即可。

AC代码:

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef long double db;
ll b[100005];
struct nodes
{
    ll a;
    int id;
    ll c;
}p[100005];
bool cmp(nodes x, nodes y)
{
    if (x.a == y.a)
        return x.id < y.id;
    return x.a < y.a;
}
bool kmp(nodes x, nodes y)
{
    return x.id < y.id;
}
void solve()
{
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
    {
        cin >> p[i].a;
        p[i].id = i;
    }
    for (int i = 1; i <= n; i++)
    {
        cin >> b[i];
    }
    sort(p + 1, p + 1 + n, cmp);
    sort(b + 1, b + 1 + n);
    for (int i = 1; i <= n; i++)
        p[i].c = b[i];
    sort(p + 1, p + 1 + n, kmp);
    for (int i = 1; i <= n; i++)
        cout << p[i].c << " ";
    cout << endl;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

C题

题目链接:https://codeforces.com/problemset/problem/1833/C

基本思路:因为奇数与奇数相减为偶数,偶属于偶数相减为偶数,奇数与偶数相减只能为奇数。所以,想要数组a变成全是偶数或者全是奇数的序列(序列有奇有偶),奇数的最小值必须比偶数的最小值小,整个序列才可以变为全奇数的序列(不可能变成全偶数)。

AC代码:

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef long double db;
int a[200005];
void solve()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    int ou = 0, ji = 0, minou = 1e9, minji = 1e9;
    for (int i = 1; i <= n; i++)
    {
        if (a[i] & 1)
        {
            ji++;
            minji = min(minji, a[i]);
        }
        else
        {
            ou++;
            minou = min(minou, a[i]);
        }
    }
    if (ji > 0 && ou > 0 && minou < minji)
    {
        cout << "NO" << endl;
    }
    else
    {
        cout << "YES" << endl;
    }
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

D题

题目链接:https://codeforces.com/problemset/problem/1833/D

基本思路:因为要获得操作之后字典序最大的排列,所以,我们要想方设法地将p[2]到p[n]之间最大的数maxx放到最前面。我们不妨设置low和high两个左右指针。当p[n]==maxx时,high指向p[n],

p[2]\leqslant maxx< p[n]的时候,high指向maxx的前一个元素。再设置一个指针op指向p[1],因为在将low到high之间的元素转换之后,low左边的元素会转移到后方。因此,为了使操作完成之后的排列尽可能地大,我们可以先将low指向high,如果p[low-1]>p[op],则将low指针左移,这样便可保证操作之后的排列的字典序最大。

AC代码:

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef long double db;
int p[2005];
void solve()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> p[i];
    int maxx = n;
    if (p[1] == maxx)
    {
        maxx--;
    }
    if (p[n] == maxx)
    {
        
        int op = 1, low = n, r = n;
        while (p[low - 1] > p[op])
            low--;
        for (int i = r; i >= low; i--)
            cout << p[i] << " ";
        for (int i = 1; i < low; i++)
            cout << p[i] << " ";
        cout << endl;
        return;
    }
    int r = 1;
    for(int i=1;i<=n;i++)
        if (p[i] == maxx)
        {
            r = i - 1;
            break;
        }
    int op = 1, low = r;
    while (p[low - 1] > p[op])
        low--;
    for (int i = r + 1; i <= n; i++)
        cout << p[i] << " ";
    for (int i = r; i >= low; i--)
        cout << p[i] << " ";
    for (int i = 1; i < low; i++)
        cout << p[i] << " ";
    cout << endl;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

E题

题目链接:https://codeforces.com/problemset/problem/1833/E

基本思路:可以使用并查集来求解。用并查集将其分为多少个组,最大值便是多少。因为每两个度为1的点可以合成一块,所以用变量ans来统计一下度为1的点,最后计算得到最小值的数量:

min(maxx,maxx-ans/2+1)

AC代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int, int>pii;
map<pii, bool>mp;
int f[200005], a[200005], du[200005];
int find(int x)//并查集认爹函数+路径压缩
{
    if (x != f[x])
        f[x] = find(f[x]);
    return f[x];
}
void solve()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    mp.clear();
    for (int i = 1; i <= n; i++)
    {
        f[i] = i;
        du[i] = 0;
    }
    for (int i = 1; i <= n; i++)
    {
        if (mp[{i, a[i]}] == false && mp[{a[i], i}] == false)
        {
            du[a[i]]++;
            du[i]++;
            f[find(i)] = find(a[i]);
            mp[{i, a[i]}] = true;
            mp[{a[i], i}] = true;
        }
    }
    int maxx = 0, ans = 0;
    for (int i = 1; i <= n; i++)
    {
        if (find(i) == i)
            maxx++;
        if (du[i] == 1)
            ans++;
    }
    
    int minn = min(maxx, maxx - ans / 2 + 1);
    cout << minn << " " << maxx << endl;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/809803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Michael.W基于Foundry精读Openzeppelin第15期——SignedMath.sol

Michael.W基于Foundry精读Openzeppelin第15期——SignedMath.sol 0. 版本0.1 SignedMath.sol 1. 目标合约2. 代码精读2.1 max(int256 a, int256 b) && min(int256 a, int256 b)2.2 average(int256 a, int256 b)2.3 abs(int256 n) 0. 版本 [openzeppelin]&#xff1a;v…

final的使用以及权限修饰符

final表示最终的、不可改变的 final跟abstract不可以同时使用&#xff0c;因为二者是冲突的。final表示不可变&#xff0c;abstrac表示必须要重写、必须要变。 常见的四种用法 修饰一个类 格式&#xff1a; public final class 类名称{ }final修饰之后&#xff0c;这个类不能…

杂谈项——关于我在bw上的见闻,以及个人对二次元游戏行业方面的前瞻

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天为大家带来一点不一样的&#xff0c;首先先光速叠一下甲&#xff1a; 在此说明博主并不是一个什么都知道的大佬&#xff0c;只是一个普通的老二次元以及期望以后能…

大数据-Spark批处理实用广播Broadcast构建一个全局缓存Cache

1、broadcast广播 在Spark中&#xff0c;broadcast是一种优化技术&#xff0c;它可以将一个只读变量缓存到每个节点上&#xff0c;以便在执行任务时使用。这样可以避免在每个任务中重复传输数据。 2、构建缓存 import org.apache.spark.sql.SparkSession import org.apache.s…

Xshell配置ssh免密码登录-公钥与私钥登录linux服务器

目录 简介 提示 方法步骤 步骤1&#xff1a;生成密钥公钥&#xff08;Public key&#xff09;与私钥(Private Key) 方法1&#xff1a;使用xshell工具 方法2&#xff1a;使用命令行 步骤2&#xff1a;放置公钥(Public Key)到服务器 方法1&#xff1a;&#xff08;我使用的是…

LeetCode551.Student-Attendance-Record-i<学生出勤记录 I>

题目&#xff1a; 思路&#xff1a; 遍历就完事了.连续三天不来return false; 超过两次缺勤 fasle; 代码是&#xff1a; //codeclass Solution { public:bool checkRecord(string s) {int n s.length();int abtimes0,latimes0;for(int i0;i<n;i){switch(s[i]){case(A):l…

总结942

5:40起床 6:00~7:00单词复习300个&#xff0c;记100个 7:15~8:00早读&#xff0c;《love is as strong as death》第一第二段 8:10~9:10三大计算回顾 9:15~10:06 习题880第一章基础选择纠错 10:10~10&#xff1a;30单词默写 10:30~11:40强化第一讲习题 11:40~12:30继续…

【雕爷学编程】MicroPython动手做(16)——掌控板之图片图像显示3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Android 设备兼容性使用详解

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、设备兼容性分类二、硬件设备兼容三、软件 APP 兼容四、兼容不同语言五、兼容不同分辨率六、兼容不同屏幕方向布局七、兼容不同硬件 Feature八、兼容…

TortoiseGit安装与配置

注&#xff1a;在安装TortoiseGit之前我已经安装了git工具。 二、Git的诞生及环境配置_tortoisegit安装包_朱嘉鼎的博客-CSDN博客 1、TortoiseGit简介 TortoiseGit是基于TortoiseSVN的Git版本的Windows Shell界面。它是开源的&#xff0c;可以完全免费使用。 TortoiseGit 支持…

redis突然变慢问题定位

CPU 相关&#xff1a;使用复杂度过高命令、数据的持久化&#xff0c;都与耗费过多的 CPU 资源有关 内存相关&#xff1a;bigkey 内存的申请和释放、数据过期、数据淘汰、碎片整理、内存大页、内存写时复制都与内存息息相关 磁盘相关&#xff1a;数据持久化、AOF 刷盘策略&…

v.sqlflow.cn 上线试用

马哈鱼数据血缘工具从2023年8月开始开通国内云版本的服务&#xff0c;相比国外版本&#xff0c;访问速度有很大的提升&#xff0c;访问域名为 https://v.sqlflow.cn. 2023年8月和9月注册的用户可免费获得价值 3000 元的一年高级帐户&#xff0c;可以使用马哈鱼数据血缘工具全部…

DCGAN对抗网络用于生成动漫卡通人物(Python代码)

DCGAN全称Deep Convolutional Generative Adversarial Networks&#xff0c;中文名深度卷积对抗网络。 1.1 DCGAN的特点 DCGAN除了G网络与CNN不同之外&#xff0c;它还有以下的不同&#xff1a; 1.取消所有pooling层。G网络中使用转置卷积&#xff08;transposed convolutiona…

集合中的数据结构

栈 先进后出入口跟出口在同一侧 队列 先进先出入口跟出口在不同的一层 数组 查询快、增删慢查询快是因为数组的地址是连续的&#xff0c;我们通过数组的首地址就可以找到数组&#xff0c;之后通过数组的下标就可以访问数组的每一个元素。增删慢是因为数组的长度是固定的&…

计算机论文中名词翻译和解释笔记

看论文中一些英文的简写不知道中文啥意思&#xff0c;或者一个名词不知道啥意思。 于是自己做了一个个人总结。 持续更新 目录 SoftmaxDeep Learning(深度学习)循环神经网络(Recurrent Neural Network简称 RNN)损失函数/代价函数(Loss Function)基于手绘草图的三维模型检索(Ske…

区块链 2.0笔记

区块链 2.0 以太坊概述 相对于比特币的几点改进 缩短出块时间至10多秒ghost共识机制mining puzzle BTC:计算密集型ETH&#xff1a;memory-hard(限制ASIC) proof of work->proof of stake对智能合约的支持 BTC&#xff1a;decentralized currencyETH&#xff1a;decentral…

一篇文章搞定克拉美罗界(CRB)

起因&#xff1a; 二郎最近在研究LBL&#xff08;长基线&#xff09;定位&#xff0c;大部分论文都提到了文中算法获得的方差接近CRB&#xff0c;所以自己的算法性能较好。于是二郎就想知道克拉美罗界是什么意思&#xff0c;以及能应用的场景。 经过&#xff1a; 1&#xff…

python整理

Python 整理&#xff08;更新中&#xff09; 一、环境搭建 1- 下载python解析器 下载地址&#xff1a;https://www.python.org/ 2- 安装解析器: 3.pycharm 安装操作 1- 下载pycharm 下载地址: https://www.jetbrains.com/pycharm/ pycharm开发第一个Python程序 在这…

20.0 HTTP 通信

1. web开发 1.1 web开发介绍 Web指的是World Wide Web(万维网), 是一种基于互联网的信息系统. 万维网由一系列通过超文本链接相互连接的页面组成, 这些页面中包含了文本, 图像, 音频, 视频等多媒体内容. 用户可以通过浏览器访问万维网上的网页, 并通过超链接在不同页面之间导…

Flowable-中间事件-消息中间捕获事件

定义 消息中间事件指在流程中将一个消息事件作为独立的节点来运行。它是一种捕获事件&#xff0c;当流程 执行到消息中间事件时就会中断在这里&#xff0c;一直等待被触发&#xff0c;直接到该事件接收到相应的消息后&#xff0c;流 程沿后继路线继续执行。消息事件是一种引用…