2024 China Collegiate Programming Contest (CCPC) Zhengzhou Onsite 基础题题解

L. Z-order Curve

 思路:这题目说了,上面那一行,只有在偶数位才有可能存在1,那么一定存在这样的数,0 ,1,100, 10000,那么反之,我们的数列是行的二倍,因此会出现10,1000,100000这样的数,因此,就可以发现,其实组成的数也是由二进制数递推的,因此我们可以从高位到低位逐步去找,如果相同且为1就变成0,如果不同就直接结束,输出L即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int l,r;
void solve()
{
	cin>>l>>r;
	for(int i=61;i>=0;i--)
	{
		int bitl=(l>>i)&1;
		int bitr=(r>>i)&1;
		if(bitl==bitr&&bitl==1)
		{
			l-=(1LL<<i);
			r-=(1LL<<i);
		}
		else if(bitl!=bitr)
		{
			cout<<l<<"\n";
			return ;
		}
	}
}
signed main()
{
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

F. Infinite Loop

 思路:这题有一个比较恶心的地方,就是说从1小时开始,实际上是从0小时开始计算,然后我们去计算公差是多少,我们现将所有的bi加在一起为sum,然后取sum和k的较大值作为公差,然后去对题目进行分析,我们会发现,从第二天开始,就去进行等差数列了,因此我们只需要计算出来第一天和第二天在什么时候完成即可,还有一个特判就是要对小时特判,如果小时是0,那么天数-1,小时+k

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,q;
int a[200005];
int b[200005];
int ans1[200005];
int ans2[200005];
int d;
int flag,x;
signed main()
{
	cin>>n>>k>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i]>>b[i];
		a[i]-=1;
		d+=b[i];
	}
	d=max(d,k);
	int t=0;
	for(int i=1;i<=n;i++)
	{
		ans1[i]=max(t,a[i])+b[i];
		t=ans1[i];
	}
	for(int i=1;i<=n;i++)
	{
		a[i]+=k;
	}
	for(int i=1;i<=n;i++)
	{
		ans2[i]=max(t,a[i])+b[i];
		t=ans2[i];
	}
	for(int i=1;i<=q;i++)
	{
		cin>>flag>>x;
		if(flag==1)
		{
			int day=ans1[x]/k;
			int hour=ans1[x]%k; 
			if(hour==0)
			{
				day-=1;
				hour+=k;
			}
			cout<<day+1<<" "<<hour<<"\n";
		}
		else
		{
			int time=ans2[x]+(flag-2)*d;
			int day=time/k;
			int hour=time%k; 
			if(hour==0)
			{
				day-=1;
				hour+=k;
			}
			cout<<day+1<<" "<<hour<<"\n";
		}
	}
	return 0;
}

B. Rolling Stones

思路:很板的一个广搜,只需要找到翻转之后,每个面上面是什么就可以了,同时要确保翻转的时候翻转过去的面,等于那个底面上的值

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[205][205];
struct node{
	int x,y;
	int qian;
	int zuo;
	int you;
	int di;
	int tmp;
};
deque<node> q;
int vis[205][205];
int ans[205][205];
int fx,fy;
void bfs()
{
	while(!q.empty())
	{
		node test=q.front();
		q.pop_front();
		int x=test.x;
		int y=test.y;
//		cout<<x<<" "<<y<<"\n";
//		cout<<test.qian<<" "<<test.zuo<<" "<<test.you<<" "<<test.di<<"\n";
		if(y%2==0)
		{
			if(vis[x][y-1]==0&&y-1>=1&&y-1<=2*x-1&&a[x][y-1]==test.zuo)//向左移动
			{
				vis[x][y-1]=1;
				q.push_back((node){x,y-1,test.you,test.qian,test.di,test.zuo,test.tmp+1});
				ans[x][y-1]=test.tmp+1;
			} 
			if(vis[x][y+1]==0&&y+1>=1&&y+1<=2*x-1&&a[x][y+1]==test.you)//向右移动
			{
				vis[x][y+1]=1;
				q.push_back((node){x,y+1,test.zuo,test.di,test.qian,test.you,test.tmp+1});
				ans[x][y+1]=test.tmp+1;
			} 
			if(vis[x-1][y-1]==0&&y-1>=1&&y-1<=2*(x-1)-1&&x-1>=1&&x-1<=n&&a[x-1][y-1]==test.qian)//向上移动
			{
				vis[x-1][y-1]=1;
				q.push_back((node){x-1,y-1,test.di,test.zuo,test.you,test.qian,test.tmp+1});
				ans[x-1][y-1]=test.tmp+1;
			}
		}
		else
		{
			if(vis[x][y-1]==0&&y-1>=1&&y-1<=2*x-1&&a[x][y-1]==test.zuo)//向左移动
			{
				vis[x][y-1]=1;
				q.push_back((node){x,y-1,test.you,test.qian,test.di,test.zuo,test.tmp+1});
				ans[x][y-1]=test.tmp+1;
			} 
			if(vis[x][y+1]==0&&y+1>=1&&y+1<=2*x-1&&a[x][y+1]==test.you)//向右移动
			{
				vis[x][y+1]=1;
				q.push_back((node){x,y+1,test.zuo,test.di,test.qian,test.you,test.tmp+1});
				ans[x][y+1]=test.tmp+1;
			} 
			if(vis[x+1][y+1]==0&&y+1>=1&&y+1<=2*(x+1)-1&&x+1>=1&&x+1<=n&&a[x+1][y+1]==test.qian)//向下移动
			{
				vis[x+1][y+1]=1;
				q.push_back((node){x+1,y+1,test.di,test.zuo,test.you,test.qian,test.tmp+1});
				ans[x+1][y+1]=test.tmp+1;
			}
		}
	}
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=2*i-1;j++)
		{
			cin>>a[i][j];
		}
	}
	cin>>fx>>fy;
	if(fx==1&&fy==1)
	{
		cout<<0<<"\n";
		return 0;
	}
	q.push_back((node){1,1,2,1,3,4,0});
	vis[1][1]=1;
	bfs();
	if(ans[fx][fy]==0)
	{
		cout<<"-1\n";
	}
	else
	{
		cout<<ans[fx][fy]<<"\n";
	}
	return 0;
}

 M. Rejection Sampling

 思路:这题一开始看起来其实是有点儿乱的,不知道在说什么,而且也不知道到底要操作什么,但是仔细阅读后会发现,那个S的概率就是C(n,k)*pi^k+(1-pi)^(n-k),若想要满足题目中的S与ai乘正比的话,我们需要满足pi/(1-pi)与ai成正比,我们可以将比例系数C设为c,因此我们可以得到式子

pi/(1-pi)=c*ai;

可以得到pi=c*ai/(1+c*ai),可知,pi关于c单调递增

c=pi/((1-pi)*ai),我们可以去二分c然后去判断pi的和是否是k

然后就解决了

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, k;
long double a[100005];  
bool check(long double c) 
{
    long double ans=0;
    long double x;
    for(int i=1;i<=n;i++) 
	{
        x =(c*a[i])/(1.00+c*a[i]);
        ans+=x;
    }
    return ans<=k;
}
signed main() 
{
    cin>>n>>k;
    for (int i=1;i<=n;i++) 
	{
        cin>>a[i];
    }
    long double l=0.0;
    long double r=1e15;
    for (int i=1;i<=200;i++) 
	{
        long double mid=(l+r)/2;
        if (check(mid)) 
		{
            l=mid;
        } 
		else 
		{
            r=mid;
        }
    }
    cout<<fixed<<setprecision(10);
    for (int i = 1;i<=n;i++) 
	{
        cout<<(long double)(l*a[i])/(1.00+l*a[i])<<"\n";
    }
    return 0;
}

C. Middle Point

思路:我们通过对题目的分析,发现每次都是通过用S集合内的元素,去折中创造新的结点,我们对其拆分可以发现,可以将一个S集合拆分为两个集合,在引用结论之前,先来写一个定式

(u+v)/2=(U+V)/2(u属于U集合,v属于V集合)

因此我们也可以将S集合拆分成两个集合一个是S'集合一个是S集合,我们的

S‘集合由原来的S'集合和S集合累加再除2得到

因此我们可以通过递归来不断去判断原来的S‘集合中选的数是什么,然后不断去更新,知道S’集合中的数等于S集合中的数就停止

用一个map去存储S集合中出现的数,如果重复出现就立刻输出-1,exit(0)退出程序,

当然了需要加上一个特判,如果一上来的数就是S集合的数,那么就直接输出0

否则就存进一个栈,然后因为是递归,倒着推,所以栈刚好可以顺序输出

#include <bits/stdc++.h>  
using namespace std;  
#define int long long  
int A, B;  
int x, y;  
struct node  
{  
    int x1, y1, x2, y2;  
};   
void solve(int x, int y)  
{  
    node p;  
    if (x <= A / 2)  
    {  
        p.x1 = 2 * x;  
        p.x2 = 0;  
    }  
    else  
    {  
        p.x1 = 2 * x - A;  
        p.x2 = A;  
    }  
    if (y <= B / 2)  
    {  
        p.y1 = 2 * y;  
        p.y2 = 0;  
    }  
    else  
    {  
        p.y1 = 2 * y - B;  
        p.y2 = B;  
    }  
        s.push(p);  
        if(p.x1==A&&p.y1==B)
        return;
        if(p.x1==A&&p.y1==0)
        return;
        if(p.x1==0&&p.y1==B)
        return;
        if(p.x1==0&&p.y1==0)
        return;
        if(s.size()<=50)
        {
        	solve(p.x1, p.y1);  
		} 
        else
        {
        	cout<<-1;
        	exit(0);
		}
   
    return;  
}  

signed main()  
{  
    cin >> A >> B;  
    cin >> x >> y;  
    if(x==A&&y==B)
    {
    	cout<<0<<"\n";
    	return 0;
	}
    if(x==A&&y==0)
    {
    	cout<<0<<"\n";
    	return 0;
	}
    if(x==0&&y==B)
    {
    	cout<<0<<"\n";
    	return 0;
	}
    if(x==0&&y==0)
    {
    	cout<<0<<"\n";
    	return 0;
	}  
    solve(x, y);  
    cout << s.size() << "\n";  
    while (!s.empty())  
    {  
        node p = s.top();  
        s.pop();  
        cout << p.x1 << " " << p.y1 << " " << p.x2 << " " << p.y2 << "\n";  
    }  
    return 0; 
}

 

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

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

相关文章

Unity2D初级背包设计后篇 拓展举例与不足分析

Unity2D初级背包设计中篇 MVC分层撰写(万字详解)-CSDN博客、 如果你已经搞懂了中篇&#xff0c;那么对这个背包的拓展将极为简单&#xff0c;我就在这里举个例子吧 目录 1.添加物品描述信息 2.拓展思路与不足分析 1.没有删除只有丢弃功能&#xff0c;所以可以添加垃圾桶 2.格…

vue(七) vue进阶

目录 第一课&#xff1a;Vue方法、计算机属性及侦听器 一、数组变化侦测 方法1&#xff1a;变更方法 方法2&#xff1a;替换一个数组 例子&#xff1a;小Demo:合并两个数组 二、计算属性 1.基础&#xff08;不推荐&#xff09; 2.使用计算属性来完成案例 3.使用函数的方…

Spring Boot 2 学习指南与资料分享

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域&#xff0c;Spring Boot 2 凭借其卓越的特性&#xff0c;为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2&#xff0c;以下这份精心…

YangQG 面试题汇总

一、交叉链表 问题&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 解题思想&#xff1a; 双指针 备注&#xff1a;不是快慢指针&#xff0c;如果两个长度相…

fastapi 使用

参考&#xff1a; https://fastapi.tiangolo.com/zh/tutorial/first-steps/https://fastapi.tiangolo.com/zh/tutorial/first-steps/ FastAPI 用于基于标准 Python 类型提示使用 Python 构建 API&#xff0c;使用 ASGI 的标准来构建 Python Web 框架和服务器。所有简单理解&a…

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告&#xff0c;需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看

泛目录和泛站有什么差别

啥是 SEO 泛目录&#xff1f; 咱先来说说 SEO 泛目录是啥。想象一下&#xff0c;你有一个巨大的图书馆&#xff0c;里面的书架上摆满了各种各样的书&#xff0c;每一本书都代表着一个网页。而 SEO 泛目录呢&#xff0c;就像是一个超级图书管理员&#xff0c;它的任务就是把这些…

k8s基础(6)—Kubernetes-存储

Kubernetes-存储概述 k8s的持久券简介 Kubernetes的持久卷&#xff08;PersistentVolume, PV&#xff09;和持久卷声明&#xff08;PersistentVolumeClaim, PVC&#xff09;为用户在Kubernetes中使用卷提供了抽象。PV是集群中的一块存储&#xff0c;PVC是对这部分存储的请求。…

深度学习-卷积神经网络反向传播梯度公式推导

这篇文章非常棒&#xff0c;单样本单通道的反向传播梯度公式推导我都理解了。为了防止找不到原网页&#xff0c;所以特复制于此 参考&#xff1a; https://zhuanlan.zhihu.com/p/640697443

论文笔记(四十七)Diffusion policy: Visuomotor policy learning via action diffusion(下)

Diffusion policy: Visuomotor policy learning via action diffusion&#xff08;下&#xff09; 文章概括5. 评估5.1 模拟环境和数据集5.2 评估方法论5.3 关键发现5.4 消融研究 6 真实世界评估6.1 真实世界Push-T任务6.2 杯子翻转任务6.3 酱汁倒入和涂抹任务 7. 实际双臂任务…

C#学习笔记 --- 简单应用

1.operator 运算符重载&#xff1a;使自定义类可以当做操作数一样进行使用。规则自己定。 2.partial 分部类&#xff1a; 同名方法写在不同位置&#xff0c;可以当成一个类使用。 3.索引器&#xff1a;使自定义类可以像数组一样通过索引值 访问到对应的数据。 4.params 数…

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念&#xff0c;下面我们来具体到每一层的具体内容进行讲解&#xff0c;每一层的每一个功能块力求用一个总览图&#xff0c;外加一个例子的图给大家进…

【2024年华为OD机试】 (CD卷,100分)- 最大N个数与最小N个数的和(Java JS PythonC/C++)

一、问题描述 题目描述 给定一个数组&#xff0c;编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。 说明&#xff1a; 数组中数字范围 [0, 1000]最大N个数与最小N个数不能有重叠&#xff0c;如有重叠&#xff0c;输入非法返回 -1输入非法返回 -1 …

WINFORM - DevExpress -> DevExpress总结[安装、案例]

安装devexpress软件 路径尽量不换&#xff0c;后面破解不容易出问题 vs工具箱添加控件例如: ①使用控制台进入DevExpress安装目录: cd C:\Program Files (x86)\DevExpress 20.1\Components\Tools ②添加DevExpress控件&#xff1a; ToolboxCreator.exe/ini:toolboxcreator…

cursor+deepseek构建自己的AI编程助手

文章目录 准备工作在Cursor中添加deepseek 准备工作 下载安装Cursor &#xff08;默认安装在C盘&#xff09; 注册deepseek获取API key 在Cursor中添加deepseek 1、打开cursor&#xff0c;选择设置 选择Model&#xff0c;添加deepseek-chat 注意这里去掉其他的勾选项&…

《零基础Go语言算法实战》【题目 2-7】defer 关键字特性

《零基础Go语言算法实战》 【题目 2-7】defer 关键字特性 下面代码的输出是什么&#xff1f;请说明原因。 package main import ( "fmt" ) func main() { deferFunc() func deferFunc() { defer func() { fmt.Println("value1") }() defer func() {…

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上&#xff0c;Mobileye展示了端到端自动驾驶系统Mobileye Drive™&#xff0c;通过高度集成的传感器、算法和计算平台&#xff0c;可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间&#xff0c;Mobileye创始人兼首席执行官Amnon …

腾讯云AI代码助手编程挑战赛-智能聊天助手

作品简介 本作品开发于腾讯云 AI 代码助手编程挑战赛&#xff0c;旨在体验腾讯云 AI 代码助手在项目开发中的助力。通过这一开发过程&#xff0c;体验到了 AI 辅助编程的高效性。 技术架构 前端: 使用 VUE3、TypeScript、TDesign 和 ElementUI 实现。 后端: 基于 Python 开发…

超大规模分类(三):KNN softmax

传统的分类损失计算输入数据和每个类别中心的距离&#xff0c;来优化模型的训练。KNN softmax通过选择和输入数据最相关的top-K个类别&#xff0c;仅计算输入数据和top-K个类别中心的距离&#xff0c;以减小计算量。 KNN softmax首次诞生于达摩院机器智能技术实验室发表的SIGKD…

MySQL素材怎么导入Navicat???

不管用什么方法都要先关掉MySQL服务&#xff0c;并且提前备份数据&#xff01; 1.有sql文件时候。 打开navicat&#xff0c;运行sql文件 然后点击后面三个点&#xff0c;选中要运行的sql文件&#xff0c;开始。 鼠标右键刷新一下&#xff0c;就能看到sql文件中的表了 2.没有s…