每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意:
有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。
输出 YES 或者 NO
——————
问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下的1平均分即可)。
以上是人类智慧的做法。
当然我们可以看到 a b 非常小,所以也可以暴力枚举1 和2 的个数。
(我赛时这么做的^ _ ^)

void solve()
{
    int a,b;cin>>a>>b;
    if (a&1)
    {
        cout<<"NO\n";
        return;
    }
    if (b&1)
    {
        if (a==0)
        {
            cout<<"NO\n";
            return;
        }
    }
    cout<<"YES\n";
}

B题意:
我也不知道为什么,赛时看不懂题…花了很长时间来理解题意。
看不懂题,赛时我是真急了。
给你一个字符串,问是否能组成一个外圈都是1,内里都是0 的方阵。(字符串是矩阵从上到下从左到右上的数字)
——————
模拟,判断就可以了。下边从1开始。第一行最后一行,如果index %n ==0或者是1 那么是最左列和最右列。(当且只有这些位置是1,就可以了)。
C二分,感觉这个没啥好说的。
D题意:
一个排列形成的图,只有若干个环
建图,会形成 若干个圈,因此 F(i) 等于 i 所在循环中的黑色元素个数。因此,我们可以写出 O(n) 中的所有循环,并记每个 i 所在循环中的黑色元素个数。
这样其实是对每一个圈遍历了两遍, 赛时写了依托,超时了。

#include <bits/stdc++.h>
using namespace std;
void solve()
{
    int n;cin>>n;
    vector<int>a(n+1);
    vector<bool>vis(n+1);
    vector<int>ans(n+1);
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    
    string s;cin>>s;
    s=" "+s;
    // 保证每一个环 只 遍历 一遍
    for (int i=1;i<=n;i++)
    {
        if (vis[i])continue;
        vis[i]=true;
        int cnt=s[i]=='0';
        int x=a[i];
        while(x!=i)
        {
            if (s[x]=='0')cnt++;
            vis[x]=true;
            x=a[x];
        }
        ans[i]=cnt;
        x=a[i];
        while(x!=i)
        {
            ans[x]=cnt;
            x=a[x];
        }
    }
    for (int i=1;i<=n;i++)
    {
        cout<<ans[i]<<" ";
    }
    cout<<"\n";


}
int main()
{
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int t;
 	 cin>>t;
    while (t--)
    {
        solve();
    }
    return 0;
}

E题意:
定义了一个 交替字符串 奇数位置上的字符形同,偶数位置上的字符相同,字符串长度为偶数。
有两种操作
1 删除一个字符(只能进行一次)
2 将一个字符替换为任意一个字符
问 最少的操作数
——————
只有长度为奇数的字符串才进行操作1.
假设字符串的长度为偶数,那么我们可以分别查看奇数和偶数位置上的字符。因此,如果我们将偶数位置上的所有字符都改为出现次数最多的字符,那么奇数位置上的字符也是如此。奇数位置上的字符也是如此。
分别处理奇数位置和偶数位置,长度减去出现次数最多的字符 出现的次数,就是答案。
长度为奇数的字符串
先删除一个字符,之后做法同上文长为偶数的字符串的做法。字符串长度是2e5我们可以枚举删除的位置,那么如何快速得到 mx1 mx0(奇数位置某个字符出现的最大次数,偶数位置)

因为字符串只有小写字母,也就是最多是26种。(状态很少,一般都可以暴力)

所以我们可以遍历26个字符,打擂台的方式获得mx1,mx0;
删除一个字符后,这个字符的个数是一个前缀和一个后缀的和。我们可以处理前缀和来获得。
删除一个字符之后,后面的位置奇偶性改变了。
偶数的情况好想,主要是 奇数 的情况,要意识到枚举,删除一个字母之后,后面的奇偶改变,只有小写字母,意味着只有26种情况,完全可以暴力枚举的。

#include <bits/stdc++.h>
using namespace std;
int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch))
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (isdigit(ch))
    {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return x * f;
}
const int N = 2e5 + 5;
int cnt[N][26][2];
// 代表 到位置 i,某个字母的 数量
// 0 代表 偶数 的位置,1 代表奇数的位置
void solve()
{
    int n;
    cin >> n;
    string s;
    cin >> s;
    s = " " + s;
    // 处理前缀和
    for (int i = 1; i <= n; i++)
    {
        for(int j=0;j<26;j++)
        {
            cnt[i][j][1]=cnt[i-1][j][1];
            cnt[i][j][0]=cnt[i-1][j][0];
        }
        cnt[i][s[i] - 'a'][i & 1] ++;
    }

    if (n & 1)
    {
        int ans=1e9;
        // 枚举 删除 每一个数 ,这个数 之后 的 位置的奇偶性发生变化
        for (int i=1;i<=n;i++)
        {
            int mx1=0,mx0=0;
            for(int j=0;j<26;j++)
            {
                mx1=max(mx1,cnt[i-1][j][1]+cnt[n][j][0]-cnt[i][j][0]);
                mx0=max(mx0,cnt[i-1][j][0]+cnt[n][j][1]-cnt[i][j][1]);

            }
            ans=min(ans,n-mx1-mx0);
        }
        cout<<ans<<"\n";
    }
    else
    {
        int mx1 = 0, mx0 = 0;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 0; j < 26; j++)
            {
                mx1 = max(mx1, cnt[i][j][1]);
                mx0 = max(mx0, cnt[i][j][0]);
            }
        }
        int ans=n-mx1-mx0;
        cout<<ans<<"\n";
    }
}
int main()
{
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

F题:
就是考个逆元,我一直wa,没处理好 负数的情况。没有好好计算 中间数 最大可能值。导致一直wa
一定要好好分析啊

#include <bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch))
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (isdigit(ch))
    {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return x * f;
}
const int mod = 1e9 + 7;
int qpow(int a, int b)
{
    a %= mod;
    int ans = 1;
    while (b)
    {
        if (b & 1)
        {
            ans = ans * a % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
void solve()
{
    int n;
    cin >> n;
    vector<int> a(n);
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        sum += a[i];
    }
    和可能会超出 mod
    sum %= mod;
    int ans = 0;
    for (int i = 0; i < n-1; i++)
    {
        sum -= a[i]; 这里可能会出现负值
        sum=(sum+mod)%mod;
        ans = ans + (a[i] * sum%mod) % mod;
        ans %= mod;
    }
   
    cout << ans * qpow((n * (n - 1) / 2 % mod), mod - 2) %mod<< "\n";
}
signed main()
{
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

G题意:
在这里插入图片描述

题目看完之后 是一点思路都没有啊。

进行的操作就是 将 任意两个数中那个较大的数,变成两个数的和或者是两个数的差。
进行任意次操作,问最大的mexk是多少。
每个数只能变成 整个数组的gcd的整数倍。(这里可以这样理解,每个数都是 gcd的倍数,所以进行两两加法和减法,生成的元素。依旧有gcd这个因数)贪心的想,因为我们要最大化mex ,所以我们将每个数尽可能的变小。也就是让小的数尽可能的出现。
所以 我们操作之后的数组 是 0 gcd 2*gcd … (n-1)*gcd
当 gcd 为1的时候,这个数组中的元素可以是任何值。
赛后补题的时候,用错字母了,框框wa

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int n, k, a[N];

void solve()
{
    cin >> n >> k;
    int d = 0;
    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
        d = __gcd(d, a[i]);
    }

    if (n == 1)
    {
        cout << (k <= a[1] ? k - 1 : k) << "\n";
        return;
    }

    if (d == 1)
    {
        cout << n - 1 + k << "\n";
        return;
    }
    int t = (n - 1) * (d - 1);
    if (k > t)
    {
        cout << (n - 1) * d + (k - t) << "\n";
        return;
    }
    int tt = k / (d - 1);
    int le = k % (d - 1);
    cout << (le == 0 ? tt * d - 1 : tt * d + le) << "\n";
}

signed main()
{
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 EMQX 开源版的 Webhook 机制处理消息并存储数据

1、前言 EMQX 是一款强大的开源 MQTT 消息代理&#xff0c;它支持大量的连接和高吞吐量&#xff0c;适用于各种物联网应用。Webhook 是 EMQX 提供的扩展功能之一&#xff0c;用于将消息推送到外部的 HTTP 服务。在本文中&#xff0c;我们将介绍如何使用 EMQX 开源版的 Webhook …

整型数组按个位值排序

题目描述 给定一个非空数组(列表)&#xff0c;其元素数据类型为整型&#xff0c;请按照数组元素十进制最低位从小到大进行排序&#xff0c;十进制最低位相同的元司 相对位置保持不变。 当数组元素为负值时&#xff0c;十进制最低位等同于去除符号位后对应十进制值最低位。 输…

QT核心内容(9.6)

1> 手写unique_ptr智能指针 代码&#xff1a; #include <iostream> #include <cassert>using namespace std; template<typename T> class my_unique_ptr { private:T* ptr;// 禁止拷贝构造函数和拷贝赋值操作符my_unique_ptr(const my_unique_ptr&a…

手机扬声器音量总是不够大?试试“扬声器助推器”吧

手机的扬声器音量总是不够大&#xff0c;尤其是在嘈杂的环境中&#xff0c;音乐和视频的声音总是不太清晰。直到我发现了这款“扬声器助推器”&#xff0c;我的手机音质瞬间提升了好几个档次。 软件简介&#xff1a; “扬声器助推器”利用先进的音频处理技术&#xff0c;能够…

vivado error:Combinatorial Loop Alert:1 LUT cells form a combinatorial loop

VIVADO ERROR :Combinatorial Loop Alert&#xff1a;1 LUT cells form a combinatorial loop vivao生成bit流时发生报错&#xff0c;如下图所示定位原因解决 vivao生成bit流时发生报错&#xff0c;如下图所示 定位原因 在三段式状态机中&#xff0c;组合逻辑代码if else 语句…

STM32:TIM定时中断配置的最全库函数讲解笔记

声明&#xff1a;本博客为哔哩哔哩up主江协科技 “STM32入门教程”的听课笔记&#xff0c;仅供学习、参考使用&#xff0c;不得用作其他用途&#xff0c;违者必究。如有版权问题&#xff0c;请联系作者修改。 目录 一、综述 二、TIM库 初始化 2.1、TIM_DeInit 恢复缺省值 …

IPv6 Sec机制的深度解析与优势探讨

IPv6的sec机制&#xff0c;主要指的是IPv6协议中内置的安全机制&#xff0c;特别是通过IP Sec协议集来实现的。IPv6在设计之初就考虑到了安全性问题&#xff0c;并内置了对IP Sec的支持&#xff0c;这使得IPv6网络在安全性能上相比IPv4有了显著的提升。 IP Sec协议集主要由认证…

Android Studio打开Modem模块出现:The project ‘***‘ is not a Gradle-based project

花了挺长时间处理该问题&#xff0c;特记录如下&#xff1a;1.背景&#xff1a; 在Android studio 下导入一个新增的modem模块&#xff0c;如MPSS.DE.3.1.1\modem_proc\AAA, 目的是看代码方便一些&#xff0c;可以自由搜索各种关键字。但导入该项目时出现了如下错误&#xff1a…

好用的AI编程助手[豆包]

欢迎来到 Marscode 的世界&#xff01;这里将为你揭秘 Marscode&#xff0c;它的独特之处、应用领域等相关精彩内容等你来探索。 一、打开VS Code 二、选择 Extensions,搜索marscode 三、点击安装 四、点击使用 五、输入需要编写的代码 六、根据自己的需求修改代码 MarsCode 注…

RabbitMQ 应用

文章目录 前言1. Simple 简单模式2. Work Queue 工作队列模式3. Pubulish/Subscribe 发布/订阅模式Exchange 的类型 4. Routing 路由模式5. Topics 通配符模式6. RPC RPC通信7. Publisher Confirms 发布确认1. 单独确认2. 批量确认3. 异步确认 前言 前面我们学习了 RabbitMQ 的…

学习笔记--MybatisPlus

官网&#xff1a;MyBatis-Plus &#x1f680; 为简化开发而生 快速入门 入门案例 引入MybatisPlus的起步依赖 定义Mapper 问题&#xff1a; MybatisPlus中Invalid bound statement (not found): com.itheima.mp.mapper.UserMapper.insert 一定要指定实体类&#xff01;&am…

GDB watch starti i files

watch break starti 在程序的最初开始运行的位置处断下来 ​​ i files 查看程序及加载的 so 的 sections ​​

遍历有向网格链路实现

在实际的业务中&#xff0c;我们可能遇到复杂规则&#xff08;多个或与条件组合&#xff09;&#xff0c;复杂链路等类似场景问题&#xff0c;如&#xff1a;规则引擎相关业务&#xff0c;生产任务排期等。 复杂链路示意图如下&#xff1a; 复杂网路链路场景描述 有一个或多…

机器学习如何用于音频分析?

机器学习如何用于音频分析&#xff1f; 一、说明 近十年来&#xff0c;机器学习越来越受欢迎。事实上&#xff0c;它被用于医疗保健、农业和制造业等众多行业。随着技术和计算能力的进步&#xff0c;机器学习有很多潜在的应用正在被创造出来。由于数据以多种格式大量可用&…

EasyExcel实现复杂Excel的导入

最近项目中遇到一个复杂的Excel的导入&#xff0c;并且数据量较大。因为数据不规则&#xff0c;所以只能使用POI进行自定义读取&#xff0c;但是发现数据量大之后&#xff0c;读取数据非常耗时。后面换成EasyExcel&#xff0c;性能起飞。 1. Excel样板 如上图&#xff0c;需要…

USB - 笔记

1.USB接口区分 2 充电宝 图中提到的各种充电协议都是用于快速充电技术的标准,适用于不同品

Chrome 浏览器插件获取网页 window 对象(方案三)

前言 最近有个需求&#xff0c;是在浏览器插件中获取 window 对象下的某个数据&#xff0c;当时觉得很简单&#xff0c;和 document 一样&#xff0c;直接通过嵌入 content_scripts 直接获取&#xff0c;然后使用 sendMessage 发送数据到插件就行了&#xff0c;结果发现不是这…

JAMA network open|自动化定量评估胃肠道肿瘤中三级淋巴结构的机器学习模型|文献精析·24-09-07

小罗碎碎念 这篇文章报道了一种基于机器学习模型的自动化方法&#xff0c;用于在常规组织病理学图像中检测和分类胃肠道癌症中的三级淋巴结构&#xff0c;并验证了其与患者生存预后的关联。 在这项多中心诊断/预后研究中&#xff0c;开发了一种基于机器学习的计算工具&#xff…

【pyhton】python如何实现将word等文档中的文字转换成语音

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

数据结构基本知识

一、什么是数据结构 1.1、组织存储数据 ---------》内存&#xff08;存储&#xff09; 1.2、研究目的 如何存储数据&#xff08;变量&#xff0c;数组....)程序数据结构算法 1.3、常见保存数据的方法 数组&#xff1a;保存自己的数据指针&#xff1a;是间接访问已经存在的…