武汉理工大学第四届ACM校赛

news2024/10/6 0:37:07

武汉理工大学第四届ACM校赛传送门

A-ST和TS回文问题 

这种题都是有一定简单的规律的

如果每个字符都相等的话,肯定存在

如果字符串T的长度是字符串S的整数倍的话,如果字符串S是回文串或者T的长度是S的长度的奇数倍的话,那么存在

否则不存在

自己构造字符串来找规律,毕竟这种问是否存在的问题,不可能在那样怎样怎样模拟,肯定是有规律的

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
string s;
int n,q;
//判断是否回文
bool check1(){
    int len=s.size();
    for(int i=0,j=len-1;i<=j;i++,j--){
        if(s[i]!=s[j]) return false;
    }
    return true;
}
//判断是否全部字符相等
bool check2(){
    char ch=s[0];
    for(int i=0;i<s.size();i++){
        if(s[i]!=ch) return false;
    }
    return true;
}
void solve()
{
    cin>>n>>q;
    cin>>s;
    while(q--){
        int op;
        cin>>op;
        bool flag=false;
        if(op==1){
            char ch;
            cin>>ch;
            s+=ch;
            n++;
        }
        else if(op==2){
            int k;
            cin>>k;
            if(check2()) flag=true;
            else if(k%n==0&&(check1()||(k/n)%2==1)) flag=true;
            if(flag) puts("Yes");
            else puts("No");
        }
    }
}
signed main()
{
    solve();
    return 0;
}

B-不降序列 

AC代码:

首先要使得权值最大,那么最多操作k次则删除k个数

从删除的反面来看,则是保留,即取子序列嘛

类似于最长上升子序列(动态规划)

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N=510;
int a[N];
int f[N][N];//f[i][j]表示以i个元素结尾,保留j个元素所能获得的最大权值
int sqr(int x){
    return x*x;
}
int res;
void solve()
{
    int n,m;
    cin>>n>>m;
    m=n-m;//至少保留m个数
    for(int i=1;i<=n;i++) cin>>a[i];
    memset(f,-0x3f,sizeof f);
    f[1][1]=0;
    for(int i=2;i<=n;i++){
        for(int j=2;j<=min(i,m);j++){
            for(int k=1;k<i;k++){
                f[i][j]=max(f[i][j],f[k][j-1]+sqr(a[i]-a[k]));
            }
        }
        if(i>=m) res=max(res,f[i][m]);//取m是因为最少保留m个,保留的越少则权值越大
    } 
    cout<<res<<endl;
}
signed main()
{
    solve();
    return 0;
}

分析为什么要初始化f为负无穷: 

如图,f[1][2]是不合法的,因为以第1个元素为结尾,保留2个元素是不存在的,而如果初始化为0的话,n那么就会转移错误

而初始化f[1][1]为0则是因为它是合法的

E-copy 

题目都理解错了,题目的意思是一共有n条信息在剪贴板上,用于粘贴,然后每次问粘贴该n条信息的哪一行到文本中,但是呢,每粘贴一次,剪贴板上的n条信息的顺序是会变的,即被粘贴的那一行会跑到第一行,最终要保证文本中的内容与给定文件文本内容一致

用容器vector,方便元素的删除与插入

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define int long long
using namespace std;
void solve()
{
    int n;
    cin>>n;
    vector<string>a(n+1);
    for(int i=0;i<n;i++) cin>>a[i];
    int m;
    cin>>m;
    cout<<m<<endl;
    while(m--){
        string s;
        cin>>s;
        for(int i=0;i<n;i++){
            if(s==a[i]){
                cout<<i+1<<endl;
                a.erase(a.begin()+i);
                a.insert(a.begin(),s);
                break;
            }
        }
    }
}
signed main()
{
    solve();
    return 0;
}

F-三角形重心 

 

注意make_pair后面是()而不是<>

利用map,关键字为pair,表示三个点横坐标之和和纵坐标之和,值为vector容器,来存放三个点的标号

如果将重心坐标的3倍(未方便,不除以3)放入map中,值为三个点的标号,如果重心已经出现过了,那么就找到了,输出YES,并把两对3个点标号输出,否则输出NO

不知道为什么三重循环不会超时,可能是中间剪枝,只要找到就结束程序,我猜答案是NO的数据都给的很小

事实证明是这样的,x一共有2000个,y一共有2000个,所以最多有2000*2000=4e6个点,然后每一组三个点的标号i,j,k代表一个重心,只要重心的个数超过了4e6,那么就一定会有重复的重心,就可以结束程序,所以时间复杂度在4e6内,不会超时 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#define int long long
using namespace std;
const int N=1e5+10;
int x[N],y[N];
void solve()
{
    int n;
    cin>>n;
    map<pair<int,int>,vector<int>>mp;
    for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            for(int k=j+1;k<=n;k++){
                if(mp.count(make_pair(x[i]+x[j]+x[k],y[i]+y[j]+y[k]))){
                    puts("YES");
                    for(auto v:mp[make_pair(x[i]+x[j]+x[k],y[i]+y[j]+y[k])]) cout<<v<<" ";
                    cout<<endl;
                    cout<<i<<" "<<j<<" "<<k<<" "<<endl;
                    return; 
                }
                else mp[make_pair(x[i]+x[j]+x[k],y[i]+y[j]+y[k])]={i,j,k};
            }
        }
    }
    puts("NO");
}
signed main()
{
    solve();
    return 0;
}

H-小e的果树 

贪心,先创建一个结构体,按照树的坐标从小到大排序

遍历每棵树

对于每棵树,都求出它以及它前面的所有树所能摘到的最大果子树,具体操作是首先横轴移动的时间是确定的,然后将该树以及前面所有树的果子按照高度从小到大排序,从高度低的开始摘,一直摘到时间用完

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#define int long long
using namespace std;
const int N=110;
struct node{
    int x;
    vector<int>a;
    bool operator<(const node &W)const{
        return x<W.x;
    }
}a[N];
int res;
void solve()
{
    int n,t;
    cin>>n>>t;
    multiset<int>s;
    int c;
    for(int i=1;i<=n;i++){
        cin>>a[i].x>>c;
        for(int j=1;j<=c;j++){
            int h;
            cin>>h;
            a[i].a.push_back(h);
        }
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        for(auto h:a[i].a) s.insert(h);
        int timeleft=t-a[i].x,num=0;
        for(auto h:s){
            if(h<=timeleft){
                num++;
                timeleft-=h;
            }
            else break;
        }
        res=max(res,num);
    }
    cout<<res<<endl;
}
signed main()
{
    solve();
    return 0;
}

K-雇佣农民 

先利用贪心求得天数(即每天都最大限度地雇佣农民,直到超出了n块矿石,当然如果刚好等于就不需要考虑以下情况了),这样得到的天数是每天最大限度地雇佣农民所得到的最少天数

那为什么就是这个天数呢?因为这样不能刚好得到n块矿石,所以每天不能最大限度雇佣农民,应消减一些,而贪心算出的矿石数是多于n的,所以前面削减以下,调整,可得到刚好n块矿石

那么为什么不取贪心得到的天数再多几天呢?因为题目说如果有多种方案输出在越早的时间雇佣农民尽量多的方案,即天数少的

对于得到的天数,确定每天雇佣的农民数量,每次都取还需要的矿石数/还剩的天数(其中sum每次求的是已雇佣的所有农民所生成的矿石数)和每天限制最大雇佣数的最小值

只有这样,最终才会刚好等于n

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define int long long
using namespace std;
const int N=2e5+10;
int day,farmer,sum;
void solve()
{
    int n;
    cin>>n;
    while(sum<n){
        day++;
        farmer+=day;
        sum+=farmer;
    }
    cout<<day<<endl;
    vector<int>a(N);
    sum=0;
    for(int i=1;i<=day;i++){
        a[i]=min((n-sum)/(day-i+1),i);
        sum+=a[i]*(day-i+1);
    }
    if(sum==n){
        for(int i=1;i<=day;i++) cout<<a[i]<<" ";
    }
    else cout<<-1<<endl;
}
signed main()
{
    solve();
    return 0;
}

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

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

相关文章

121.实战网页图片优化

如上图所示&#xff0c;这个图标的内部尺寸为14791459&#xff0c;但是我们实际呈现的渲染的效果为570562&#xff1b;所以我们可以调整一下图像的大小&#xff0c;缩小图片的文件大小&#xff1b; 我们可以修改他的尺寸&#xff0c;文件的大小就缩小了。但是在网页上显示一点区…

软件测试之单元测试详解

目录 前言&#xff1a; 1、什么是单元测试&#xff1f; 2、什么是好的单元测试&#xff1f; 3、怎么写单元测试&#xff1f; 4、玩转单元测试 前言&#xff1a; 单元测试是软件测试中的一种测试方法&#xff0c;用于验证代码中最小可测试单元的正确性。它主要关注对程序的…

云上百世慧|「慧」聚智能制造的全流程质量管控(我们在7月31日等你)

在制造业的迅猛发展中&#xff0c;「质量管控」一直是企业面临的重要挑战和痛点。如何对「原材料、组件、生产过程和最终产品」进行严格的监控和控制&#xff1f; 稳抓行业痛点&#xff0c;优化质量流程 质量管控&#xff0c;是确保产品符合标准的关键环节。通过严格的监控和控…

卸载mathtype导致的word问题 MathPage.wll not found

MathType 6.9简体中文版是一款功能很强大的数学公式编辑器,但是因为不明原因,有时会出现找不到MathType.dll或者MathPage.wll文件找不到的错误窗口提示&#xff0c;而导致软件无法正常使用&#xff0c;本文将教您解决MathPage.wll或MathType.dll文件找不到的问题。 错误提示&a…

5 给属性赋值的几种方式

首先创建两个类&#xff0c;Person和Dog。为了可以被扫描到&#xff0c;在前面加入Component注解。 Person类如下&#xff1a; package jiang.com.helloworld.pojo;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.…

React 之 过渡动画

一、React的过渡动画 在开发中&#xff0c;我们想要给一个组件的显示和消失添加某种过渡动画&#xff0c;可以很好的增加用户体验 可以通过原生的CSS来实现这些过渡动画&#xff0c;但是React社区为我们提供了react-transition-group用来完成过渡动画 React曾为开发者提供过动画…

MySQL表/用户权限等基本操作

MySQL表操作练习题&#xff1a; 第一题&#xff1a; 具体要求如下所示&#xff1a; 1. 创建数据库Market&#xff1a; CREATE DATABASE Market;2. 创建customers表&#xff1a; 表结构如图所示&#xff1a; CREATE TABLE customers( c_num INT(11) PRIMARY KEY, c_name…

TiDB(8):技术内幕之计算

1 关系模型到 Key-Value 模型的映射 在这我们将关系模型简单理解为 Table 和 SQL 语句&#xff0c;那么问题变为如何在 KV 结构上保存 Table 以及如何在 KV 结构上运行 SQL 语句。 假设我们有这样一个表的定义&#xff1a; CREATE TABLE User {ID int,Name varchar(20),Role …

基于springboot+vue的文超市进销存管理系统(源代码+数据库+12000字论文)083

基于springbootvue的文超市进销存管理系统(源代码数据库12000字论文)083 一、系统介绍 (本项目有ssmvue版本) 本系统分为管理员、用户、员工三种角色 用户角色包含以下功能&#xff1a; 登录、注册、购物车、订单提交、商品评论、收藏、充值、收货地址管理、收藏管理、订单…

NXP-无感BLDC代码MCSPTE1AK116_BLDC_6Step代码详解

目录 开发平台 工程目录 Generated_Code Sources Config 电机的参数 BLDC参数 无感模式下的一些参数 Peripherals FTM/PDB/ADC配置参数 actuate_s32k meas_s32k motor_structure state_machine main main()主函数 PORT_IRQHandler() PDB0_IRQHandler() FTM1…

最大正方形 · Maximal Square

链接&#xff1a; 题解&#xff1a;九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 1.暴力的方法&#xff1a;遍历每一个&#xff08;i&#xff0c;j&#xff09;位置&#xff0c;如果当前点为1&#xff0c;则以当前节点为…

如何编写PlantUml文本绘图时序图

效果如图 代码示例 startumlparticipant "上游" as BEGIN participant "SFTP" as SFTP control "文件系统" as FILE participant "业务系统" as BUSactivate BEGIN BEGIN ->SFTP: 上传文件 activate SFTP autonumber 1.0 FILE -&g…

常用的网址

画图网页&#xff1a; https://www.processon.com/diagrams 二进制转换网页&#xff1a; https://tool.oschina.net/hexconvert/ 在线网络计算器 https://www.sojson.com/convert/subnetmask.html 学习网站掘金&#xff1a; https://juejin.cn 注册外网账号网页&#xff1a…

使用Lambda表达式对List<Map<String,Object>>中key值相同的Map进行分组合并

现有两张表A表和B表&#xff0c;A表存放的是各省市的认证次数&#xff0c;B表存放的是各省市的申领次数&#xff0c;重点关注dq,cs这两个字段&#xff0c;其他的字段可忽略 A表&#xff08;省市认证次数表&#xff09; B表&#xff08;省市申领次数表&#xff09; 项目中有以下…

辅助性能优化——长安链性能分析工具原理及用法

如何提升区块链系统性能是很多开发者都会关注的事&#xff0c;但是有些对区块链并非十分熟悉的开发者可能会感到没有头绪。长安链提供了性能分析工具帮助开发者梳理系统耗时&#xff0c;优化系统性能。下面对长安链性能分析工具原理及使用进行介绍。 一、 概述 time_counter.s…

Windows兼容性设置图文教程,Windows兼容模式怎么设置?服务器兼容是什么意思?服务器兼容性怎么改?

兼容性&#xff08;compatibility&#xff09;是指硬件之间、软件之间或是软硬件组合系统之间的相互协调工作的程度。兼容的概念比较广&#xff0c;相对于硬件来说&#xff0c;几种不同的电脑部件&#xff0c;如CPU、主板、显示卡等&#xff0c;如果在工作时能够相互配合、稳定…

备战秋招004(20230706)

文章目录 前言一、今天学习了什么&#xff1f;二、关于问题的答案1.SE 总结 前言 提示&#xff1a;这里为每天自己的学习内容心情总结&#xff1b; Learn By Doing&#xff0c;Now or Never&#xff0c;Writing is organized thinking. 目前的想法是&#xff0c;根据 Java G…

三种方法将视频转换为AVI格式,与大家分享!

将视频转换为AVI格式是常见的需求&#xff0c;因为AVI格式具有广泛的兼容性和可编辑性。本文将介绍三种常用的方法&#xff0c;包括记灵在线工具、剪映和格式工厂。这些方法简单易行&#xff0c;帮助您将视频文件快速转换为AVI格式&#xff0c;满足不同的需求。 方法一&#x…

EasyCVR接入大量设备级联后出现分组加载异常是什么原因?

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。 有用…

接口自动化测试实战之pytest框架+allure讲解

一、前言 本文章主要会讲解Python中pytest框架的讲解&#xff0c;介绍什么是pytest、为何要测试、为何使用以及参考和扩展等等&#xff0c;话不多说&#xff0c;咱们直接进入主题哟。 二、pytest讲解 2.1 什么是pytest&#xff1f; pytest是一款单元测试框架&#xff0c;在…