11.3比赛总结

Bricks

1.题意:有一个由 B 和 W 组成的字符串,要将它划分成尽量多的区间,并使得每个区间中 B 和 W 的比例相等。

2.一道贪心题。首先特殊处理比值恒为 0 和不存在比值的情况,也就是全是 W 或者 B,明显这两种情况下每一个字符分一组就是最优解。

对于其它情况,发现所有段的比值都等于整个串里面的比值,也就是比值固定。在这个前提下,发现如果对于某一个满足比值区间,其子区间同样满足这个比值,将这个大区间拆成这个子区间和其补集同样满足条件,而且划分出的区间还多了一个。由此得出结论,每一次从边缘贪心地选取出最短可以满足条件的区间一定是最优的。

具体判断时可以计算出当前情况下满足条件需要的数量,检验这个数量是否可以被取到即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100010;
int T,n,cnt1,cnt2,num[N],col[N],ans,c1,c2,t;
char c;
int gcd(int a,int b){
	if(b==0)return a;
	return gcd(b,a%b);
}
void init(){
	cnt1=cnt2=ans=c1=c2=t=0;
}
signed main(){
	scanf("%lld",&T);
	while(T--){
		init();
		scanf("%lld",&n);
		for(int i=1;i<=n;i++){
			scanf("%lld",&num[i]);
			for(c=getchar();c!='B'&&c!='W';c=getchar());
			if(c=='B')col[i]=1,cnt1+=num[i];
			else col[i]=2,cnt2+=num[i];
		}
		if(cnt1==0||cnt2==0){
			printf("%lld\n",cnt1+cnt2);
			continue;
		}
		int GCD=gcd(cnt1,cnt2);
		cnt1=cnt1/GCD;cnt2=cnt2/GCD;
		for(int i=1;i<=n;i++){
			if(col[i]==1){
				if(c2%cnt2!=0){
					c1+=num[i];
					continue;
				}
				t=(cnt1*(c2/cnt2))-c1;
				if(c2&&t>=0&&t<=num[i])ans++,c1=num[i]-t,c2=0;
				else c1+=num[i];
			}
			else{
				if(c1%cnt1!=0){
					c2+=num[i];
					continue;
				}
				t=(cnt2*(c1/cnt1))-c2;
				if(c1&&t>=0&&t<=num[i])ans++,c2=num[i]-t,c1=0;
				else c2+=num[i];				
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}

中国象棋

(硬核打标应该能得40分)

1.如果一行或者一列有三个炮的话将会不合法,所以我们考虑记数组去存储有几列放了一个炮,有几列放了两个炮。考虑转移,状态:f[i][j][k]代表放了前ii行,有jj列是有一个棋子,有kk列是有2个棋子的合法方案数。

这时知道全部的列数,又知道一些情况的列数,所以我们可以求出不放棋子的列数

单步容斥:空的=全部的−合法的(即空的序列=m−j−k)

由3种情况:

        可以在当前第i行不放棋子

        可以在当前第i行放一个棋子

        可以在当前第i行放两个棋子

不放棋子:f[i][j][k]=f[i−1][j][k]。

放一个棋子不会选择放在有两个棋子的列。放在一个棋子的列:f[i][j][k]+=f[i−1][j+1][k−1]*(j+1)。放在没有棋子的列:f[i][j][k]+=f[i−1][j−1][k]*(m−(j−1)−k)。

放两个棋子:一个放在有一个棋子的列,一个放在没有棋子的列:f[i][j][k]+=f[i-1][j][k-1]*j*(m−j−(k−1))  都放在没有棋子的列:f[i][j][k]+=f[i-1][j-2][k]*\textrm{c}_{m-(j-2)-k}^{2}  都放在有一个棋子的列:f[i][j][k]+=f[i-1][j+2][k-2]*\textrm{c}_{j+2}^{2}

PS:记得判断边界。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f3f3f3f3f,p=1e9+9;
int n,ans=1,cnt;
int pr[N];
int pre[N];
void init(int n){
    for(int i=2;i<=n;i++){
        if(!pre[i]){
            pr[++cnt]=i;
            pre[i]=i;
        }
        for(int j=1;j<=cnt&&pr[j]*i<=n;j++){
            pre[i*pr[j]]=pr[j];
            if(i%pr[j]==0) break;
        }
    }
}
int fpm(int a,int b){
    int res=1;
    while(b){
        if(b&1){
            res*=a;
            res%=p;
        }
        a*=a;
        a%=p;
        b>>=1;
    }
    return res;
}
bool cmp(int a,int b){
    return a>b;
}
signed main(){
	freopen("math.in","r",stdin);
    freopen("math.out","w",stdout);
	cin>>n;
	init(2e5);
	vector<int> v;
	while(n!=1){
	    v.push_back(pre[n]);
	    n/=pre[n];
    }
    sort(v.begin(),v.end(),cmp);
    for(int i=2;i<=v.size()+1;i++){
        ans*=fpm(pr[i],v[i-2]-1);
        ans%=p;
    }
    cout<<ans;
    return 0;
}

小学奥数

1.这道题比较简单。

考虑暴力:可以先打标找找规律(打表打多了其实就水过10分了),可以先反过来考虑一下,先想一想把一个数分解为连续自然数之和,然后统计下来,暴力查询。

#include<bits/stdc++.h>
using namespace std;
const int kN =1e5+1,kM=1e9+9;
int n,ans=1,v[kN],r[kN];
vector<int> p,s;
void init(){
  	for(int i=2;i<kN;i++){
    	if(!v[i]) p.push_back(i);
    	for(int j=0;j<p.size()&&p[j]*i<kN;j++){
      		v[p[j]*i]=1;
      		if(i%p[j]==0) break;
    	}
  	}
}
int P(int x,int y){
  	int res=1;
  	for(;y;y>>=1,x=1ll*x*x%kM){
    	(y&1)&&(res=1ll*res*x%kM);
  	}
  	return res;
}
int C(int x, int y){
  	int res=1;
  	for(int i=2;i<=x+1;i++){
    	if(1ll*P(p[i],r[i]*y-1)*P(p[res],r[res]-1)<P(p[res],r[res]*y-1)){
      		res=i;
    	}
  	}
  	return res;
}
int main(){
  	cin>>n;
  	init();
  	for(int i=0;i<p.size()&&n;i++){
    	while(n%p[i]==0){
      		s.push_back(p[i]);
			n/=p[i];
    	}
  	}
  	fill(r,r+kN,1);
  	sort(s.begin(),s.end(),greater<int>());
  	for(int i=0,j=1;i<s.size();i++){
    	int t=C(j,s[i]);
    	j=max(j,t),r[t]*=s[i];
  	}
  	for(int i=1;i<=20;i++){
    	ans=1ll*ans*P(p[i],r[i]-1)%kM;
  	}
  	cout<<ans;
  	return 0;
}

正解:用ans来记录答案,(一个数本身就是好数),所以要将ans的初始值设为1。可以设(x+1)+(x+2)+...+(x+d)=n。(x,d都是非负整数)。可以解得d∗(2x+d+1)=2n。令u∗v=2n,那么d=u,x=(v−u−1)/2,我们需要要求v>u且u,v得奇偶性不同。所以x,d得选择方案就是n的奇因子个数,所求的奇因子的个数,就是奇质因子的幂次+1后乘起来,所以我们需要将n分解质因数后贪心即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f3f3f3f3f,p=1e9+9;
int n,ans=1,cnt;
int pr[N];
int pre[N];
void init(int n){
    for(int i=2;i<=n;i++){
        if(!pre[i]){
            pr[++cnt]=i;
            pre[i]=i;
        }
        for(int j=1;j<=cnt&&pr[j]*i<=n;j++){
            pre[i*pr[j]]=pr[j];
            if(i%pr[j]==0) break;
        }
    }
}
int fpm(int a,int b){
    int res=1;
    while(b){
        if(b&1){
            res*=a;
            res%=p;
        }
        a*=a;
        a%=p;
        b>>=1;
    }
    return res;
}
bool cmp(int a,int b){
    return a>b;
}
signed main(){
	cin>>n;
	init(2e5);
	vector<int> v;
	while(n!=1){
	    v.push_back(pre[n]);
	    n/=pre[n];
    }
    sort(v.begin(),v.end(),cmp);
    for(int i=2;i<=v.size()+1;i++){
        ans*=fpm(pr[i],v[i-2]-1);
        ans%=p;
    }
    cout<<ans;
    return 0;
}

Triple Jump

1.这道题可以用线段树,想到似乎只能先枚举a,b然后再算h[2b−a+1]到h[r]的最大值。在分析处理中可知,很多(a,b)是无效的,会额外耗费时间。

分类讨论ha和hb的大小关系:

当ha≥hb枚举b ,可以发现:如果存在a1<a2满足ha1,ha2≥hb,那么(a1,b)是无效的。因为一组方案(a1,b,c)一定可以被(a1,a2,c)替代。也就是说需要找到最大的a满足a<b,ha≥hb。

ha<hb时枚举a,我们同样考虑b1,b2,发现一组方案(a,b2,c)一定可以被(b1,b2,c)替代。于是我们只需要找到最小的b满足a<b,ha<hb。可以用单调栈查询。枚举r,设xl是满足l=a且2b−a+1≥r的(a,b)中ha+hb 的最大值,yl是限制l=a时[l,r]的答案,那每次查询只需计算yl到yr的最大值。
考虑到r−1到r时x,y的变化,一些x会进行单点修改;然后yi会与xi+hr 取max。可以用线段树维护。

#include<bits/stdc++.h>
using namespace std;
struct tree{
	int w1,w2,tag;
}tr[2000005];
int n,m,a[500005],ans[500005],st[500005],l,r;
vector<int>v[500005];
vector<pair<int,int> >q[500005];
void pushup(int k){
	tr[k].w1=max(tr[k<<1].w1,tr[k<<1|1].w1);
	tr[k].w2=max(tr[k<<1].w2,tr[k<<1|1].w2);
}
void build(int k,int l,int r){
	if(l==r){
		tr[k].w1=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	pushup(k);
}
void update(int k,int v){
	tr[k].tag=max(tr[k].tag,v);
	tr[k].w2=max(tr[k].w2,tr[k].w1+tr[k].tag);
}
void pushdown(int k){
	if(!tr[k].tag)return;
	update(k<<1,tr[k].tag);update(k<<1|1,tr[k].tag);
	tr[k].tag=0; 
}
void change(int k,int l,int r,int x,int y,int v){
	if(x<=l&&r<=y){update(k,v);return;}
	int mid=(l+r)>>1;pushdown(k);
	if(x<=mid)change(k<<1,l,mid,x,y,v);
	if(y>mid)change(k<<1|1,mid+1,r,x,y,v);
	pushup(k);
}
int query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)return tr[k].w2;
	int mid=(l+r)>>1,res=0;pushdown(k);
	if(x<=mid)res=max(res,query(k<<1,l,mid,x,y));
	if(y>mid)res=max(res,query(k<<1|1,mid+1,r,x,y));
	return res;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int top=0;
	for(int i=1;i<=n;i++){
		while(top&&a[st[top]]<a[i])v[st[top]].emplace_back(i),top--;
		if(top)v[st[top]].emplace_back(i);
		st[++top]=i;
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>l>>r;
		q[l].emplace_back(make_pair(r,i));
	}
	build(1,1,n);
	for(int i=n;i>=1;i--){
		for(int j=0;j<v[i].size();j++){
			int l=i,p=v[i][j];
			if(2*p-l<=n) change(1,1,n,2*p-l,n,a[l]+a[p]);
		}
		for(int j=0;j<q[i].size();j++) ans[q[i][j].second]=query(1,1,n,i,q[i][j].first);
	}
	for(int i=1;i<=m;i++)cout<<ans[i]<<'\n'; 
	return 0;
}

All in all

t1t2都是贪心,没想出来正确的策略,暴力也写挂了,还要多练

t3能看出来是dp,得了40分,但里面的部分细节还是有点问题

t4当时不会,没写出暴力

总之,简单的题没写对,难的题暴力没写出来,还要加强训练。

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

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

相关文章

excel自定义导出实现(使用反射)

前言 项目中接到需求&#xff0c;需要对导出的字段进行自定义导出 &#xff0c;用户可在前端选择自定义导出的字段&#xff08;如图&#xff09;&#xff0c;实现过程做以下记录&#xff0c;仅供参考&#xff1b; 思路 跟前端约定好所有要导出的字段名称(headName)跟对应的…

“游戏人”也能拿诺贝尔奖!

“游戏人”也能拿诺贝尔奖&#xff01; 点击蓝链领取游戏开发教程 2024年度的诺贝尔奖&#xff0c;堪称AI深刻影响传统科学领域的一次生动展现。在这一年里&#xff0c;备受瞩目的诺贝尔物理学奖与诺贝尔化学奖两大核心奖项&#xff0c;均颁给了在AI领域做出杰出贡献的研究者…

OmniGen: Unified Image Generation(代码的复现)

文章目录 论文简介模型的部署需要下载的预训练权重 模型的生成效果图像编辑的效果风格迁移的效果 总结 论文简介 OmniGen的github项目地址 OmniGen: Unified Image Generation。OmniGen 在各种图像生成任务中都表现出了卓越的性能&#xff0c;并可能大大超过现有扩散模型的极…

docker-compose安装rabbitmq 并开启延迟队列和管理面板插件(rabbitmq_delayed_message_exchange)

问题&#xff1a; 解决rabbitmq-plugins enable rabbitmq_delayed_message_exchange &#xff1a;plugins_not_found 我是在docker-compose环境部署的 services:rabbitmq:image: rabbitmq:4.0-managementrestart: alwayscontainer_name: rabbitmqports:- 5672:5672- 15672:156…

Pandas 数据可视化指南:从散点图到面积图的全面展示

Pandas 数据可视化指南&#xff1a;从散点图到面积图的全面展示 本文介绍了使用 Pandas 进行数据可视化的多种方法&#xff0c;包括散点图、折线图、条形图、直方图、饼图和面积图等&#xff0c;涵盖了常见的图表类型及其实现方式。通过提供详细的代码示例&#xff0c;展示了如…

电力电子论文(TPE、TTE)投稿经验分享

本节博客不进行技术分享&#xff0c;仅分享我的投稿经验&#xff0c;主要介绍投稿时间戳、投稿注意事项。 TPE&#xff1a; 首先介绍的是电力电子老牌顶刊——IEEE Transactions on Power Electronics&#xff0c;缩写PE、TPE、TPEL。截止写稿时间&#xff0c;该期刊Impact Fa…

YOLOv11模型架构以及使用命令介绍

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

【高等数学】1函数极限连续

1. 函数 复合函数的性质及其图形 反函数的性质及其图形 分段函数的性质及其图形 隐函数的性质及其图形 基本初等函数(通常包括幂函数、指数函数、对数函数、三角函数、反三角函数)的性质及其图形 初等函数(由基本初等函数经过有限次的四则运算和复合运算所得到的函数)…

评估 机器学习 回归模型 的性能和准确度

回归 是一种常用的预测模型&#xff0c;用于预测一个连续因变量和一个或多个自变量之间的关系。 那么&#xff0c;最后评估 回归模型 的性能和准确度非常重要&#xff0c;可以帮助我们判断模型是否有效并进行改进。 接下来&#xff0c;和大家分享如何评估 回归模型 的性能和准…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (6) - 触屏事件

AWTK 作为一个GUI引擎&#xff0c;自然少不了对触屏事件的支持。这里我们先支持单点触摸&#xff0c;后续再支持多点手势。 1. 注册 XComponent 的触屏事件回调 这个在 AppNapi 的构造函数中完成&#xff1a; AppNapi::AppNapi(std::string &id) {id_ id;component_ n…

2024年大厂AI大模型面试题精选与答案解析

前言 随着AI市场&#xff0c;人工智能的爆火&#xff0c;在接下来的金九银十招聘高峰期&#xff0c;各大科技巨头和国有企业将会对AGI人才的争夺展开一场大战&#xff0c;为求职市场注入了新的活力。 为了助力求职者在面试中展现最佳状态&#xff0c;深入理解行业巨头的选拔标…

GNN 训练点击-购买 预测模型

搜集到click-buy数据集&#xff0c; 数据集分享在网盘 通过百度网盘分享的文件&#xff1a;数据集_20241031_220915 链接&#xff1a;https://pan.baidu.com/s/1qcXAO_P1h3Vrrui5qFbYLw?pwd6f3m 其中 yoochoose-buys.dat 特征含义buy_df.columns [session_id, timestamp, …

SpringMvc day1102

ok了家人们今天我们学习SpringMvc&#xff0c;之后学习SpringBoot&#xff0c;let‘s go 六.拦截器 6.1 拦截器概述 Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter &#xff0c;用于对处理器 ( 自己编写的 Controller) 进行预处理和后 处理。用户可以自…

项目管理(风险:范围、成本、时间、质量)

项目管理主要是围绕着范围、成本、时间、质量&#xff0c;每个部分都存在不同的风险。 存在潜在的风险方面&#xff0c;也有可能是法律风险、合作方带来的风险等。 减少风险&#xff1a; 提前与技术沟通方案。产品内部先讨论。每日例会&#xff1a;同步信息&#xff0c;减少…

6.0、静态路由

路由器最主要的功能就是转发数据包。路由器转发数据包时需要查找路由表&#xff08;你可以理解为地图&#xff09;&#xff0c;管理员可以直接手动配置路由表&#xff0c;这就是静态路由。 1.什么是路由&#xff1f; 在网络世界中&#xff0c;路由是指数据包在网络中的传输路…

网络层3——IP数据报转发的过程

目录 一、基于终点的转发 1、理解 2、IP数据报转发过程 二、最长前缀匹配 1、理解 2、主机路由 3、默认路由 三、二叉线索查找 一、基于终点的转发 1、理解 理解什么叫终点转发 IP数据报的传递&#xff0c;交给路由器后 可不可以做到直接发送给目的主机呢&#xff1f;…

VMware虚拟机Debian扩展磁盘

一、 版本 VMware&#xff1a;Workstation 17 Pro虚拟机&#xff1a;Debian11 二、 VMware虚拟机扩展 虚拟机关机状态快照或者备份&#xff1a;以免扩容失败导致文件丢失虚拟机——设置——硬盘——磁盘使用工具——扩展——扩展磁盘容量——设置为想要的大小 三、 虚拟机…

新能源汽车的未来:车载电源与V2G技术的前景

近年来&#xff0c;新能源汽车在全球市场上发展迅速&#xff0c;尤其是在中国&#xff0c;新能源汽车的月销量已经超过了燃油车。随着新能源技术的不断发展&#xff0c;新能源汽车不仅仅是作为出行工具&#xff0c;而逐渐成为“移动能源站”。本文将探讨电动汽车的车载外放电功…

JavaScript知识点梳理及案例实践

1. Date对象 创建Date对象 //方法1&#xff1a;不指定参数 var nowd1new Date(); console.log(nowd1.toLocaleString( )); //方法2&#xff1a;参数为日期字符串 var d2new Date("2004/3/20 11:12"); console.log(d2.toLocaleString( )); var d3new Date("04/…

[vulnhub]DC:7

https://www.vulnhub.com/entry/dc-7,356/ 端口扫描主机发现 探测存活主机&#xff0c;178是靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-03 13:30 CST Nmap scan report for 192.168.75.1 Host is up (0.00037s l…