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

news2025/1/11 9:04:12

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.coloradmin.cn/o/2112631.html

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

相关文章

FreeRTOS学习笔记(二)任务基础篇

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2…

TMGM:美国劳动力市场正常化,而非衰退

新的数据显示&#xff0c;美国劳动力市场的降温正在增强对美联储降息的信心&#xff0c;但目前对主要市场的影响尚未明朗。本周&#xff0c;劳动力市场成为焦点&#xff0c;因为它有能力决定美联储何时以及多大幅度地削减其关键利率。周五的官方非农就业报告将成为亮点&#xf…

探究零工市场小程序如何改变传统兼职模式

近年来&#xff0c;零工市场小程序正逐渐改变传统的兼职模式&#xff0c;为求职者和雇主提供了一个更为高效、便捷的平台。本文将深入探讨零工市场小程序如何影响传统兼职模式&#xff0c;以及它带来的优势和挑战。 一、背景与挑战 传统的兼职市场往往存在信息不对称的问题&am…

辉煌版单据的金额字段可以使用自定义公式

有些用户反馈&#xff0c;使用管家婆录入单据时&#xff0c;金额不是数量乘以单价&#xff0c;需要增加一些自定义字段参与&#xff0c;所以需要自定义金额的计算公式&#xff0c;这样原来的单价乘以数量就不能满足了。其实管家婆是支持自定义公式的&#xff0c;具体操作如下&a…

广度优先搜索Breadth-First-Search

目录 1.问题 2.算法 3.代码 4.参考文献 1.问题 广度优先搜索&#xff0c;稍微学过算法的人都知道&#xff0c;网上也一大堆资料&#xff0c;这里就不做过多介绍了。直接看问题&#xff0c;还是从下图招到一条从城市Arad到Bucharest的路径。 该图是连通图&#xff0c;所以必然…

顺序表的定义

一.概述&#xff1a; 二.顺序表&#xff1a; 1.概念&#xff1a; 2.顺序表的实现&#xff1a; 1)静态分配&#xff1a; 比如数组&#xff0c;数组大小一旦确定&#xff0c;就不可以再被改变。 ElemType代表数据类型&#xff0c;比如整型&#xff0c;浮点型等。 例如&#x…

工厂数字化转型利器:.NET Core 与 ARMxy 嵌入式边缘计算网关

在当今数字化时代&#xff0c;工厂数字化转型已成为提高生产效率、降低成本、提升竞争力的关键。.NET Core与 ARMxy 嵌入式边缘计算网关的结合为工厂数字化转型提供了强大的技术支持。 一、.NET Core 的优势 跨平台性&#xff1a;.NET Core 可以在 Windows、Linux 和 macOS 等…

Python 从入门到实战10(流程控制-选择语句)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了python 中集合的定义及相关操作。今天…

初识string(一)and内存管理

对类和对象的补充&#xff1a;缺省参数在函数定义中从右向左依次赋值&#xff0c;如果从右向左有一个参数没有赋值缺省参数&#xff0c;则左边的变量就不能在赋缺省参数&#xff0c;类中的变量可以赋缺省参数并且没有限制。 在类定义中我们总是看到函数后加const。这其实是调用…

算法备案究竟难在哪里?

算法备案究竟难在哪里&#xff1f; 在当今数字化社会中&#xff0c;算法备案已成为人工智能技术应用中的一个关键环节。然而&#xff0c;对于初学者和企业来说&#xff0c;这一过程充满了挑战和复杂性。本文将深入探讨算法备案的难度和应对策略。 算法备案的挑战 首先&#xff…

标准库标头 <filesystem> (C++17)学习

此头文件是文件系统支持库的一部分。本篇介绍filesystem命名空间的一些函数。 函数 在命名空间 std::filesystem 定义 absolute (C17) 组成一个绝对路径 (函数) canonicalweakly_canonical (C17) 组成一个规范路径 (函数) relativeproximate (C17) 组成一个相对路径 (函数) c…

提高开发效率的实用工具库VueUse

VueUse中文网&#xff1a;https://vueuse.nodejs.cn/ 使用方法 安装依赖包 npm i vueuse/core单页面使用&#xff08;useThrottleFn举例&#xff09; import { useThrottleFn } from "vueuse/core"; // 表单提交 const handleSubmit useThrottleFn(() > {// 具…

Android中Fragment的最佳实践—简易版的新闻应用

文章目录 Android中Fragment的最佳实践—简易版的新闻应用app/build.gradle当中添加依赖库新建新闻实体类News新建布局文件news_content_frag.xml新建NewsContentFragment类单页模式需新建NewsContentActivity新建news_title_frag.xml新建news_item.xml新建NewsTitleFragment修…

el-date-picker年份选择默认值为当前年,并且将获取时间转为年月日格式

<el-date-pickervalue-format"yyyy"v-model"leftQuery.year":disabled"timeArr && timeArr.length ! 0 ? true : false"type"year"placeholder"选择年"changechangeYear:picker-options"pickerOptions&quo…

Python GUI入门详解-学习篇

一、简介 GUI就是图形用户界面的意思&#xff0c;在Python中使用PyQt可以快速搭建自己的应用&#xff0c;自己的程序看上去就会更加高大上。 有时候使用 python 做自动化运维操作&#xff0c;开发一个简单的应用程序非常方便。程序写好&#xff0c;每次都要通过命令行运行 pyt…

第4章-03-用WebDriver获取页面Cookie

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

IDEA提交git代码前执行checkstyle校验

为了统一团队人员代码风格&#xff0c;在代码协同时经常会引入对应的checkstyle校验功能&#xff0c;配置好代码style后一般在IDEA执行mvn validate功能即可&#xff0c;如下图所示&#xff1a; 但是有时忘记执行怎么办&#xff0c;IDEA在代码提交前也有对应的配置&#xff0c;…

【Java并发编程 | JUC】线程

Java 线程 项目配置 pom.xml <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><dependency><groupId>ch.qos.…

orcle 数据库 day0903

ok奥家人们&#xff0c;今天继续学习orcle数据库 一. 数据完整性 向某张表插入数据、更新、删除数据之前会对数据做校验&#xff0c;目 的就是为了确保数据的正确性、一致性、最大限度 减少重复 的数据、避免脏数据&#xff0c;这就是数据完整性。以下的数据就是脏 数据&a…

表情,符号,数字,字母,加密和解密源码

表情&#xff0c;符号&#xff0c;数字&#xff0c;字母&#xff0c;加密和解密源码 可以将表情&#xff0c;动物&#xff0c;水果&#xff0c;表情&#xff0c;手势&#xff0c;猫语&#xff0c;兽语&#xff0c;狗语&#xff0c;爱语&#xff0c;符号&#xff0c;数字&#x…