2023年ACM竞赛班 2023.3.20题解

 目录

瞎编乱造第一题

瞎编乱造第二题

瞎编乱造第三题

瞎编乱造第四题

瞎编乱造第五题

不是很想编了但还是得编的第六题

不是很想编了但还是得编的第七题

还差三道题就编完了的第八题

还差两道题就编完了的第九题

太好啦终于编完了


为啥一周六天早八阿

瞎编乱造第一题

因为偶数因子的操作是可逆,所以我们只要匹配奇数因子就可以了

输入的时候我们就把每个偶数元素一直除到奇数

之后我们枚举b数组每一位右移

匹配上就标记一下

如果全匹配上就是Yes,否则就是No

#include <bits/stdc++.h>
using namespace std;
  
 
const int MAXN = 200005;
int a, bb, b[MAXN];
bool vis[MAXN];
  
void solve()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i)
    {
        vis[i] = 0;
    }
    multiset<int> sa;
    for (int i = 1; i <= n; ++i)
    {
        cin >> a;
        while ((a & 1) == 0)
        {
            a >>= 1;
        }
        sa.insert(a);
    }
    for (int i = 1; i <= n; ++i)
    {
        cin >> bb;
        while ((bb & 1) == 0)
        {
            bb >>= 1;
        }
        b[i] = bb;
    }
    for (int j = 0; j < 32; ++j)
    {
        for (int i = 1; i <= n; ++i)
        {
            if (vis[i])
            {
                continue;
            }
            auto it = sa.find(b[i] >> j);
            if (it != sa.end())
            {
                sa.erase(it);
                vis[i] = 1;
            }
        }
    }
    cout << (sa.empty() ? "YES\n" : "NO\n");
    return;
}
signed main(){
    int tt;
    cin>>tt;
    while(tt--){
        solve();
    }
}

瞎编乱造第二题

对区间总体加减可以转化为差分问题

第一个操作可以转化为第一个数差分-1,选一个位置差分+1

第二个操作可以转化为选一个位置差分-1

第三个操作可以转化为第一个数差分加1

我们把所有的差分求出来后,先将从2-n所有差分归零,在将第一个数归零即可

代码如下

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int n, m, k;
int a[N], d[N];
signed main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin >> T;
    while (T -- ) {
        cin >> n;
        for (int i = 1; i <= n; i ++) cin >> a[i];
        for (int i = 1; i <= n; i ++) d[i] = a[i] - a[i - 1];
        int res = 0;
        for (int i = 2; i <= n; i ++)
            if (d[i] < 0) {
                res -= d[i];
                d[1] += d[i];                
            }
            else res += d[i];
        res += abs(d[1]);
        cout << res << '\n';
    }
    return 0;
}

瞎编乱造第三题

只要从2-n的每个a[i]都是a[1]的倍数即可满足条件

反之则不行

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
signed main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int T;
    int t=1;
    cin>>t;
    while(t--) 
    {
        int n;
        cin>>n;
        int a1;
        cin>>a1;
        int flag=1;
        for (int i=2; i<=n; i++) 
        {
            int x;cin>>x;
            if (x%a1!=0)flag=0;
        }
        if(flag==1) cout<<"Yes";
        else cout<<"No";  
   
        cout << endl;
    }
    return 0;
}

瞎编乱造第四题

当n为奇数时候,先手必胜,因为只要先手第一轮全拿走,第二轮后手就会拿到你的位置,他就输了

当n为偶数时,因为每个人拿的堆是固定的,所以只要看一下谁最少的堆个数少,谁就会先拿完

谁就输了

要是都相等,就是先手输

代码如下

#include <bits/stdc++.h>
  
using i64 = long long;
  
void solve() {
    int n;
    std::cin >> n;
     
    std::vector<int> a(n);
    std::array<i64, 2> step{};
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
    }
     
    if (n % 2 == 1) {
        std::cout << "Mike\n";
        return;
    }
     
    for (int t = 0; t < 2; t++) {
        int min = std::numeric_limits<int>::max();
        int j = -1;
        for (int i = t; i < n; i += 2) {
            if (a[i] < min) {
                min = a[i];
                j = i / 2;
            }
        }
        step[t] = 1LL * (n / 2) * min + j;
    }
     
    if (n % 2 == 1 || step[0] > step[1]) {
        std::cout << "Mike\n";
    } else {
        std::cout << "Joe\n";
    }
}
  
int main() {
    // freopen("9.in","r",stdin);
    // freopen("9.out","w",stdout);
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
     
    int t;
    std::cin >> t;
     
    while (t--) {
        solve();
    }
     
    return 0;
}

瞎编乱造第五题

只要这个字符串的最后两位不相等,这个字符串就一定满足条件

所以只要遍历一遍,找两个不相等的字符,贡献就是遍历到他的索引(这个代码里有解释)

之后再加上n(每个单独的字符串都满足条件)

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
signed main() {
    // ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin>>T;
    while(T--) 
    {
        long long sum = 0;
        int n;
        scanf("%lld", &n);
        string s = " ";
        cin >> s;
        for(int i = 1; i < n; i++){
            if(s[i] != s[i - 1]){
                //+ i的原因在于
                //以i这个位置的字符结尾的子串恰好是这么多
                //↑比如说"1001"的"01",以他们结尾的子串是"1001" "001" "01"正好对应索引3 
                //如果末位2字符成立,所有子串都成立,反之亦然
                //而这里是没有把"1"和"0"算进去的,他们必然是成立的,所以直接在外面加就行了  
                sum += i;
            }
        }
        printf("%lld\n", (sum + n));
    }
     
    return 0;
}

不是很想编了但还是得编的第六题

只要找到x的最低位一并保留即可

如果x只有唯一一位1,答案就要再加1(最低位保留一个1,保证异或大于0)

特判一下1

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
#define INF 0x3f3f3f3f
#define lowbit(x) ((x)&(-x))
const ll MOD = 1000000007;
// const ll MOD = 998244353;
const int N = 500010;
 
void slove()
{
    int n;
    cin >> n;
    if(n == 1)
        {
            cout << 3 << '\n';
            return;
        }
    ll ans = lowbit(n);
    if(ans != n)
        cout << ans << '\n';
    else
        cout << ans+1 << '\n';
}
  
int main(void)
{
    // freopen("9.in","r",stdin);
    // freopen("9.out","w",stdout);
    IOS;
    int tt = 1;
    cin >> tt;
    while(tt--)
        {
            slove();
        }
    return 0;
}

不是很想编了但还是得编的第七题

我们找到一个最先变成奇数的数(如果本来就有奇数,那就不需要这步)

把他变成奇数

之后所有的偶数加上这个奇数变成奇数

代码如下

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
#define lowbit(x) ((x)&(-x))
int a[N];
signed main() {
    // ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin>>T;
    while(T--) 
    {
 
        int n;
        cin >> n;
        for(int i=1;i<=n;++i)
            {
                cin >> a[i];
            }
        int ans = 0;
        for(int i=1;i<=n;++i)
            {
                if(a[i]&1)
                    ans++;
            }
        if(ans)
            {
                cout << n-ans << '\n';
                continue;
            }
        int minn = 1e9+7;
        for(int i=1;i<=n;++i)
            {
                int tmp = lowbit(a[i]);
                int cnt = 0;
                while(tmp != 1)
                    {
                        tmp/=2;
                        cnt++;
                    }
                minn = min(minn , cnt);
            }
        cout << minn+n-1 << '\n';
 
   
    }
     
    return 0;
}

还差三道题就编完了的第八题

就把所有数像山一样排起来就好了,中间大两边小

>2数量的x对答案的贡献是1

(假如这样一个数组,1 1 2 2 3 3 4 4,这样排好之后答案就是4,每个数都有两个以上,每个数都贡献1,排好之后1 2 3 4 4 3 2 1)

其他=1的x对答案贡献是总的这样的数/2上取整

(假如这样一个数组,1 2 3 4 5,排好之后答案是3,因为贡献是5/2上取整,排好之后1 3 5 4 2)

这两组贡献加起来

#include <bits/stdc++.h>
  
using i64 = long long;
  
void solve() {
    int n;
    std::cin >> n;
     
    std::map<int, int> cnt;
    for (int i = 0; i < n; i++) {
        int x;
        std::cin >> x;
        if (cnt[x] < 2) {
            cnt[x]++;
        }
    }
     
    int ans = 0, v = 0;
    for (auto [x, c] : cnt) {
        if (c == 2) {
            ans++;
        } else {
            v++;
        }
    }
    ans += (v + 1) / 2;
    std::cout << ans << "\n";
}
  
int main() {
    // freopen("10.in","r",stdin);
    // freopen("10.out","w",stdout);
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
     
    int t;
    std::cin >> t;
     
    while (t--) {
        solve();
    }
     
    return 0;
}

还差两道题就编完了的第九题

每个陷阱最初的贡献是a[i]-(n-i),先按这个排好序

(躲掉的伤害减去之后增加的伤害)

接下来考虑陷阱之间相互作用

前面每跳过一个陷阱,后面陷阱躲掉的伤害就+1,贡献也+1

所以是排好序的数组遍历前k个

满足a[i]-(n-i)+(前面跳过的陷阱数)>0这个等式,就可以跳

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
#define lowbit(x) ((x)&(-x))
int a[N];
signed main() {
    // ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin>>T;
    while(T--) 
    {
 
        long long sum = 0;
        int n, k;
        cin >> n >> k;
        for (int i = 1; i <= n; ++i)
        {
            cin >> a[i];
            sum += a[i];
            a[i] -= n - i;
        }
        sort(a + 1, a + 1 + n, greater<long long>());
        for (int i = 1; i <= k; ++i)
        {
            if (a[i] > -i)
            {
                sum -= a[i] + i - 1;
            }
            else
            {
                break;
            }
        }
        cout << sum << '\n';
 
   
    }
     
    return 0;
}

太好啦终于编完了

对于每个前面是>后面是<的位置,把它称之为山谷

也包括第一个<左边的位置和最后一个>右边的位置

我们让每个山谷都是0

之后向两边扩散,每层加1

每个取max就好

代码如下

#include <bits/stdc++.h>
using namespace std;
string a;
int arr[500002]= {0,};
int main()
{
    cin>>a;
    int n = a.size();
    for(int i=0;i<n;i++)
    {
        if(a[i]== '<')
            arr[i+1] = max(arr[i+1],arr[i]+1);
    }
    for(int i=n-1;i>=0;i--)
    {
        if(a[i]== '>')
            arr[i] = max(arr[i+1]+1,arr[i]);
    }
    long long sum = 0;
    for(int i=0;i<=n;i++)
    {
        sum += arr[i];
    }
    cout<<sum;
}

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

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

相关文章

【Matlab算法】粒子群算法求解一维线性函数问题(附MATLAB代码)

MATLAB求解一维线性函数问题前言正文函数实现可视化处理可视化结果前言 一维线性函数&#xff0c;也称为一次函数&#xff0c;是指只有一个自变量xxx的函数&#xff0c;且函数表达式可以写成yaxbyaxbyaxb的形式&#xff0c;其中aaa和bbb是常数。具体来说&#xff0c;aaa称为斜…

typedef uint8_t u8;(stm32数据类型)

在stm32单片机的库文件里有这么一段u8和u16的定义 typedef uint8_t u8; typedef uint16_t u16&#xff1b; 而uint8_t和uint16_t的定义是这样的 typedef unsigned char uint8_t; typedef unsigned short int uint16_t; 意味着u8就是就是指代的unsigned char …

linux简单入门

目录Linux简介Linux目录结构Linux文件命令文件处理命令文件查看命令常用文件查看命令Linux的用户和组介绍Linux权限管理Linux简介 Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff0…

【Nginx二】——Nginx常用命令 配置文件

Nginx常用命令 配置文件常用命令启动和重启 Nginx配置文件maineventshttp常用命令 安装完成nginx后&#xff0c;输入 nginx -&#xff1f;查询nginx命令行参数 nginx version: nginx/1.22.1 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix][-e filename] [-c filename] [-…

[数据结构]直接插入排序、希尔排序

文章目录排序的概念和运用排序的概念排序运用常见的排序算法常见的排序算法直接插入排序希尔排序性能对比排序的概念和运用 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操…

FastApi快速构建一个web项目

FastApi快速构建一个web项目 已经使用FastApi很久了。这个一个非常优秀的框架。和flask一样能够快速构建一个web服务。开发效率非常之高。今天我一个Demo来介绍一下这个框架的使用。供大家学习参考。 项目介绍 本项目主要介绍fastapi快速编写web服务&#xff0c;通过案例分别…

贪心算法(一)

一、概念 贪心算法的核心思想是&#xff0c;在处理一个大问题时&#xff0c;划分为多个局部并在每个局部选择最优解&#xff0c;并且认为在每个局部选择最优解&#xff0c;那么最后全局的问题得到的就是最优解。 贪心算法可以解决一些问题&#xff0c;但是不适用于所有问题&a…

音乐制作:Ableton Live 11 Suite Mac

Ableton Live 11 Suite Mac是一款非常专业的音乐制作软件&#xff0c;Live 是用于音乐创作和表演的快速、流畅和灵活的软件。它带有效果、乐器、声音和各种创意功能;制作任何类型的音乐所需的一切。以传统的线性排列方式进行创作&#xff0c;或者在 Live 的 Session 视图中不受…

MyBatisPlus的Wrapper使用示例

一、wapper介绍 1、Wrapper家族 在MP中我们可以使用通用Mapper&#xff08;BaseMapper&#xff09;实现基本查询&#xff0c;也可以使用自定义Mapper&#xff08;自定义XML&#xff09;来实现更高级的查询。当然你也可以结合条件构造器来方便的实现更多的高级查询。 Wrappe…

【Spring6】| Spring IoC注解式开发

目录 一&#xff1a;Spring IoC注解式开发 1. 回顾注解 2. 声明Bean的四个注解 3. Spring注解的使用 4. 选择性实例化Bean 5. 负责注入的注解&#xff08;重点&#xff09; 5.1 Value 5.2 Autowired与Qualifier 5.3 Resource 6. 全注解式开发 一&#xff1a;Spring I…

Springboot+vue开发的图书借阅管理系统项目源码下载-P0029

前言图书借阅管理系统项目是基于SpringBootVue技术开发而来&#xff0c;功能相对比较简单&#xff0c;分为两个角色即管理员和学生用户&#xff0c;核心业务功能就是图书的发布、借阅与归还&#xff0c;相比于一些复杂的系统&#xff0c;该项目具备简单易入手&#xff0c;便于二…

基于深度学习的车型识别系统(Python+清新界面+数据集)

摘要&#xff1a;基于深度学习的车型识别系统用于识别不同类型的车辆&#xff0c;应用YOLO V5算法根据不同尺寸大小区分和检测车辆&#xff0c;并统计各类型数量以辅助智能交通管理。本文详细介绍车型识别系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码…

你掌握了吗?在PCB设计中,又快又准地放置元件

在印刷电路板设计中&#xff0c;设置电路板轮廓后&#xff0c;将零件(占地面积)调用到工作区。然后将零件重新放置到正确的位置&#xff0c;并在完成后进行接线。 组件放置是这项工作的第一步&#xff0c;对于之后的平滑布线工作是非常重要的工作。如果在接线工作期间模块不足…

MagicalCoder可视化开发平台:轻松搭建业务系统,为企业创造更多价值

让软件应用开发变得轻松起来&#xff0c;一起探索MagicalCoder可视化开发工具的魔力&#xff01;你是否为编程世界的各种挑战感到头痛&#xff1f;想要以更高效、简单的方式开发出专业级的项目&#xff1f;MagicalCoder低代码工具正是你苦心寻找的产品&#xff01;它是一款专为…

什么是Nginx

一.什么是nginxNginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;是一款由俄罗斯的程序设计师Igor Sysoev使用c语言开发的轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;官方测试nginx能够支支撑5万…

蓝桥杯冲刺 - week1

文章目录&#x1f4ac;前言&#x1f332;day192. 递归实现指数型枚举843. n-皇后问题&#x1f332;day2日志统计1209. 带分数&#x1f332;day3844. 走迷宫1101. 献给阿尔吉侬的花束&#x1f332;day41113. 红与黑&#x1f332;day51236. 递增三元组&#x1f332;day63491. 完全…

Java四种内部类(看这一篇就够了)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

详细介绍less(css预处理语言)

详细介绍less&#xff08;css预处理语言&#xff09;什么是lessless解决什么问题less相比于css的优点如何使用less第一步&#xff1a;创建一个less文件第二步&#xff1a;引入less文件第三步&#xff0c;编写less文件&#xff08;和html一样的结构&#xff09;完整代码示例什么…

C 单链表及其相关算法 万字详解(通俗易懂)

目录 一、前言 : 二、线性结构 1.介绍 2.分类 3.数组和链表的区别 : 三、链表 [离散存储] 1.定义 2.相关概念 3.如何确定一个链表&#xff1f; 4.如何表示链表中的一个结点&#xff1f; 5.链表的分类 四、链表的相关算法 1.链表的创建和遍历 ①准备工作 : ②创建链表 :…

【Vue全家桶】带你全面了解通过Vue CLI初始化Vue项目

【Vue全家桶】带你全面了解通过Vue CLI初始化Vue项目 文章目录【Vue全家桶】带你全面了解通过Vue CLI初始化Vue项目写在前面一、Vue CLI脚手架1.1 认识Vue CLI1.2 Vue CLI 安装和使用二、Vue create 项目的过程2.1 创建项目2.2选择 Manually select features创建2.3 选择Vue的版…