ZISUOJ 2024算法基础公选课练习二

一、前言

先把代码丢上来,后续再补上思路

二、题目总览

ac162b2f392f4cb5bba5db987f3f7bef.png

三、具体题目

3.1 问题 A: 成绩排序1

3135011fc36d4ce4ae746167e43ba568.png

参考代码

简单排序

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int t = 1;
    std::cin >> t;
    while(t--) {
        int n;
        std::cin >> n;
        std::vector<int> v(n);
        for(auto &vi:v) std::cin >> vi;
        std::sort(v.begin(),v.end(),[&](const int &num1,const int &num2) {
            return num1>num2;
        });
        for(int i = 0;i<n;i++) std::cout << v[i] << " \n"[i==n-1];
    }
    
    return 0;
}

3.2 问题 B: 数字和排序

3d1b1eb404f648da997ede216d19cd63.png

参考代码

简单排序

#include <bits/stdc++.h>
using i64 = long long;
using pii = std::pair<int,int>;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n = 1;
    while(std::cin >> n) {
        if(n==0) break;
        std::vector<pii> v(n);
        for(int i = 0;i<n;i++) {
            int num;std::cin >> num;
            int tmp = num,sum = 0;
            while(tmp!=0) {
                sum+=tmp%10;
                tmp/=10;
            }
            v.emplace_back(sum,num);
        }
        std::sort(v.begin(),v.end(),[&](const pii& p1,const pii& p2) {
            if(p1.first!=p2.first) return p1.first>p2.first;
            return p1.second > p2.second;
        });
        for(int i = 0;i<n;i++) {
            std::cout << v[i].second << " \n"[i==n-1];
        }

    }
    
    return 0;
}

3.3 问题 C: 帆帆的挂件

e6237a365218498ab6cf1ce16e9b0f27.png

参考代码

简单模拟

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n,x_0;
    std::cin >> n >> x_0;
    std::vector<int> a(n),b(n);
    for(auto &ai:a) std::cin >> ai;
    for(auto &bi:b) std::cin >> bi;
    int ans = 0;
    for(int i = 0;i<n;i++) {
        if(x_0>=a[i]) {
            x_0+=b[i];
            ++ans;
        }
    }
    std::cout << ans << '\n';
    
    return 0;
}

3.4 问题 D: 文件名排序

aa95c4f631f14b6f8481e5829e7ed0be.png

参考代码

stringstream很好处理这种读入情况

#include <bits/stdc++.h>
using i64 = long long;
using pss = std::pair<std::string,std::string>;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    std::string line;
    std::vector<pss> v;
    while(std::getline(std::cin,line)) {
        std::stringstream ss(line);
        std::string tmp1,tmp2;
        while(ss >> tmp1 >> tmp2) v.emplace_back(tmp2,tmp1);
    }
    std::sort(v.begin(),v.end());
    for(const auto &vi:v) {
        std::cout << vi.second << ' ' << vi.first << '\n';
    }
    
    return 0;
}

3.5 问题 E: 火星数排序

2bae9a1544da4ce98b2488b9261fd77b.png

参考代码

可以用哈希表映射过去,写题的时候脑子犯昏,写了好多if

#include <bits/stdc++.h>
using namespace std;
struct number{
	int en;
	int mn;
}a[1000];

int earth(int n){
	int temp=n;
	int total = 0;
	int sum[20];
	int index = 0;
	while(temp != 0){
		if(temp%10==0){
			sum[index] = 0;
		}else if(temp%10==8){
			sum[index] = 1;
		}else if(temp%10==1){
			sum[index] = 2;
		}else if(temp%10==5){
			sum[index] = 3;
		}else if(temp%10==2){
			sum[index] = 4;
		}else if(temp%10==3){
			sum[index] = 5;
		}else if(temp%10==9){
			sum[index] = 6;
		}else if(temp%10==4){
			sum[index] = 7;
		}else if(temp%10==7){
			sum[index] = 8;
		}else if(temp%10==6){
			sum[index] = 9;
		}
		index++;
		temp /= 10;
	}
	for(int i = index-1;i>=0;i--) total = total*10+sum[i];
	return total;
}


bool cmp1(number a,number b){
	return a.en<b.en;
}
int main(){
    cin.tie(nullptr)->sync_with_stdio(false);

	int Case;
	cin>>Case;
	for(int i=0;i<Case;i++){
		int j=0;
		int n;cin >> n;
		for(int j = 0;j<n;j++) cin >> a[j].mn;

		for(int j = 0;j<n;j++) a[j].en = earth(a[j].mn);
		sort(a,a+n,cmp1);

		for(int j = 0;j<n;j++){
			if(j==0) cout << a[j].mn;
			else cout << ' ' << a[j].mn;
		}
		cout << '\n';
	}
	
	
	return 0;
}

3.6 问题 F: 帆帆的数位计算

fc254ef556cb4911804d7ae33dd2d48b.png

参考代码

写个循环模拟就行,我当时想复杂了

#include <bits/stdc++.h>
using i64 = long long;

void dfs(std::string num,int step) {
    if(num.size()==1) {
        std::cout << step << '\n';
        return;
    }
    int sum = 0;
    for(const auto &c:num) {
        sum+=c^48;
    }
    dfs(std::to_string(sum),step+1);
}
int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    std::string num;
    std::cin >> num;
    dfs(num,0);
    
    return 0;
}

3.7 问题 G: 帆帆的数列

a3cbc26be75d4db798b84107f9cded02.png

参考代码

前缀和+贪心

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int t = 1;
    std::cin >> t;
    while(t--) {
        int n,m;
        std::cin >> n;
        std::vector<int> a(n+1,0),preA(n+1,0);
        for(int i = 1;i<=n;i++) {
            std::cin >> a[i];
            preA[i] = preA[i-1]+a[i];
        }
        std::cin >> m;
        std::vector<int> b(m+1,0),preB(m+1,0);
        for(int i = 1;i<=m;i++) {
            std::cin >> b[i];
            preB[i] = preB[i-1]+b[i];
        }

        int ans = 0;
        for(int i = 0;i<=n;i++) {
            for(int j = 0;j<=m;j++) {
                ans = std::max(ans,preA[i]+preB[j]);
            }
        }
        std::cout << ans << '\n';
    }
    
    return 0;
}

3.8 问题 H: 帆帆的糖

dff4f2074e4f45a4978112b343c80389.png

参考代码

一开始当成dfs写了,没看到范围,真是蠢了。可以直接二分枚举答案,不能直接暴力,会TLE

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n,k;
    std::cin >> n >> k;
    int ans = 0;
    int low = 1,high = n;
    
    while(low<high) {
        int mid = (low+high)>>1;
        if(1LL*(1+mid)*mid/2-(n-mid)>=k) {
            high = mid;
        }else {
            low = mid+1;
        }
    }
    std::cout << n-low << '\n';

    return 0;
}

3.9 问题 I: Determine the Photo Position

90509c8110e9494a999386473f63cd7f.png

参考代码

前缀和

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n,m;
    std::cin >> n >> m;
    std::vector<std::vector<char>> g(n+5,std::vector<char>(n+5));
    std::vector<std::vector<int>> pre(n+5,std::vector<int>(n+5,0));
    for(int i = 1;i<=n;i++) {
        for(int j = 1;j<=n;j++) {
            std::cin >> g[i][j];
            pre[i][j]=pre[i][j-1]+(g[i][j]^48);
        }
    }

    std::string t;std::cin >> t;

    int ans = 0;
    for(int i = 1;i<=n;i++) {
        for(int j = m;j<=n;j++) {
            if(pre[i][j]-pre[i][j-m]==0) {
                ++ans;
            }
        }
    }
    std::cout << ans << '\n';

    return 0;
}

3.10 问题 J: Ball Dropping

6d3e1820e72f4b03b807428c87d94187.png

参考代码

初中数学计算

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    double r,a,b,h;
    std::cin >> r >> a >> b >> h;
    if(2*r<=b) {
        std::cout << "Drop\n";
        return 0;
    }
    double h0 = std::sqrt(h*h+((a-b)/2)*((a-b)/2));
    double sin = ((a-b)/2)/h0;
    double cos = h/h0;
    double tan = ((a-b)/2)/h;
    double x1 = r*sin,x2 = (r*cos-b/2)/tan;

    std::cout << "Stuck\n";
    std::cout << std::fixed << std::setprecision(10) << x1+x2 << '\n';

    return 0;
}

3.11 问题 K: Cut the Tree

c8a12463fc934044acd4f796c3019b0c.png

参考代码

套了别人的两个模板,链式前向星和带权的线段树+dfs找树上LIS,注意数组不能开太大也不能开太小

#include <bits/stdc++.h>
using i64 = long long;
using pii = std::pair<int,int>;
constexpr int N = 1e5+5,M = N,INF = 0x3f3f3f3f;

//链式前向星
int head[N];
int val[N];
int n;
int ans;

struct edge{
	int next, to, w;
}e[N << 1];
int cnt;

void init(){
	for(int i = 0; i <= n; i++)
		head[i] = -1;
	cnt = 0;
}

void add(int u, int v, int w = 0){
	e[cnt].w = w;
	e[cnt].to = v;
	e[cnt].next = head[u];
	head[u] = cnt++;
}

//带权线段树+dfs找LIS
int tot;
struct Tree{
	int l, r;
	int lis, lds;
}tree[N * 100];
int rt[N];
int sz[N];
int root, maxPart;
int res;
int vis[N];
void getrt(int S, int u, int f){
	sz[u] = 1;
	int maxx = 0;
	for(int i = head[u]; ~i; i = e[i].next){
		int v = e[i].to;
		if(vis[v] || f == v)
			continue;
		getrt(S, v, u);
		sz[u] += sz[v];
		maxx = std::max(maxx, sz[v]);
	}
	maxx = std::max(maxx, S - sz[u]);
	if(maxx < maxPart){
		maxPart = maxx;
		root = u;
	}
}
int build(){
	tot++;
	tree[tot].l = tree[tot].r = tree[tot].lis = tree[tot].lds = 0;
	return tot;
}
void update(int &p, int l, int r, int pos, int vlis, int vlds){
	if(p == 0)
		p = build();
	tree[p].lis = std::max(tree[p].lis, vlis);
	tree[p].lds = std::max(tree[p].lds, vlds);
	if(l == r)
		return ;
	int m = (l + r) >> 1;
	if(pos <= m)
		update(tree[p].l, l, m, pos, vlis, vlds);
	else
		update(tree[p].r, m+1, r, pos, vlis, vlds);
}
int merge(int p, int q){
	if(!p || !q)
		return p + q;
	tree[p].lis = std::max(tree[p].lis, tree[q].lis);
	tree[p].lds = std::max(tree[p].lds, tree[q].lds);
	// 最大上升子序列长度
	res = std::max(res, std::max(tree[tree[p].l].lis + tree[tree[q].r].lds,
		tree[tree[p].r].lds + tree[tree[q].l].lis));
	tree[p].l = merge(tree[p].l, tree[q].l);
	tree[p].r = merge(tree[p].r, tree[q].r);
	return p;
}
pii query(int p, int l, int r, int L, int R){ // L R 询问
	if(!p || l > r)
		return {0, 0};
	if(L <= l && r <= R)
		return {tree[p].lis, tree[p].lds};
	int m = (l + r) >> 1;
	pii ret = {-INF, -INF};
	pii tr, tl;
	if(L <= m)
		tl = query(tree[p].l, l, m, L, R);
	if(m < R)
		tr = query(tree[p].r, m+1, r, L, R);
	ret.first = std::max(tl.first, tr.first);
	ret.second = std::max(tl.second, tr.second);
	return ret;
}
void dfs(int u, int f){
	rt[u] = 0;
	for(int i = head[u]; ~i; i = e[i].next){
		int v = e[i].to;
		if(v == f)
			continue;
		dfs(v, u);
	}
	int nlis = 0, nlds = 0;
	for(int i = head[u]; ~i; i = e[i].next){
		int v = e[i].to;
		if(v == f)
			continue;
		int lis = query(rt[v], 1, n, 1, val[u]-1).first;
		int lds = query(rt[v], 1, n, val[u]+1, n).second;
		rt[u] = merge(rt[u], rt[v]);
		res = std::max(res, lis + 1 + nlds);
		res = std::max(res, nlis + 1 + lds);
		nlis = std::max(nlis, lis);
		nlds = std::max(nlds, lds);
	}
	update(rt[u], 1, n, val[u], nlis + 1, nlds + 1);
}
void calc(int S, int u){
	maxPart = S;
	getrt(S, u, 0);
	vis[root] = 1;
	int maxx = 0, pos = -1;
	for(int i = head[root]; ~i; i = e[i].next){
		int v = e[i].to;
		res = 0;
		dfs(v, root);
		if(res > maxx){
			maxx = res;
			pos = v;
		}
	}
	ans = std::min(ans, maxx);
	if(pos == -1 || vis[pos])
		return ;
	calc(sz[pos], pos);
}
void solve(){
	std::cin >> n;
	init();
	for(int i = 1; i < n; i++){
		int u, v;
		std::cin >> u >> v;
		add(u, v);
		add(v, u);
	}
	for(int i = 1; i <= n; i++)
		std::cin >> val[i];
	ans = INF;
	calc(n, 1);
	std::cout << ans << '\n';
}

int main(){
	std::cin.tie(nullptr)->sync_with_stdio(false);
	
    int T;
    // std::cin >> T;
    T = 1;
    while(T--){
        solve();
    }

	return 0;
}

 

 

 

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

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

相关文章

阿里云智能语音交互产品试用,基于语音识别、语音合成、自然语言理解

VER&#xff1a;2024年1月25日 17:29:33 智能语音交互产品基于语音识别、语音合成、自然语言理解 新开通智能语音交互服务用户&#xff0c;可享有3个月免费试用期&#xff0c;试用期间将不会产生费用 智能语音交互产品基于语音识别、语音合成、自然语言理解等技术&#xff0c…

服务器被攻击排查记录

起因 我的深度学习的所有进程突然被killed&#xff0c;我以为是检修&#xff0c;后面发现好像简单的python代码可以正常运行。但是我的训练进程一启动就会被killed 第一时间没有用htop查看cpu&#xff0c;用top看着挺正常的&#xff0c;但是后面看htop&#xff0c;全是绿的&a…

安卓好软-----电脑端查看apk全部信息的工具 查看包名 名称以及权限等等

有时候从网络下载的应用很多是英文。时间久了会忘记到底是什么apk应用。这款工具可以方便的查看apk应用的名称 包名以及各种权限 图标 大小版本号等等。方便用户随时查看 APK Helper能够详细地获得安装包名、软件名称、APK证书、真实版本号、要求的手机版本、系统权限、以及证书…

算法每日双题精讲——双指针(移动零,复写零)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…

【SQL】在 SQL Server 中创建数据源是 MySQL 数据表的视图

背景&#xff1a;Windows系统已安装了mysql5.7和sqlServer数据库&#xff0c;现在需要在sqlServer创建视图或者查询来自mysql的数据&#xff0c;视图的数据来源mysql数据库。下面进行实现在sqlserver实现获取mysql数据表数据构建视图。 1、打开 ODBC 数据源管理器&#xff0c;…

Git 入门篇(一)

前言 操作系统&#xff1a;win11 64位 与gitee搭配使用 Git 入门篇&#xff08;一&#xff09; Git 入门篇&#xff08;二&#xff09; Git 入门篇&#xff08;三&#xff09; 目录 git下载、安装与配置 下载 安装 配置 git下载、安装与配置 下载 官网&#xff1a;git-…

【React】条件渲染——逻辑与运算符

条件渲染——逻辑与&&运算符 你会遇到的另一个常见的快捷表达式是 JavaScript 逻辑与&#xff08;&&&#xff09;运算符。在 React 组件里&#xff0c;通常用在当条件成立时&#xff0c;你想渲染一些 JSX&#xff0c;或者不做任何渲染。 function Item({ nam…

Ubuntu 的 ROS 操作系统安装与测试

引言 机器人操作系统&#xff08;ROS, Robot Operating System&#xff09;是一个用于开发机器人应用的开源框架&#xff0c;它提供了一系列功能丰富的库和工具&#xff0c;能够帮助开发者构建和控制机器人。 当前&#xff0c;ROS1的最新版本为Noetic Ninjemys&#xff0c;专为…

无人驾驶汽车——AI技术在交通领域的进展与未来展望

文章目录 前言什么是无人驾驶汽车?特斯拉的无人驾驶愿景无人驾驶的技术进程:从DARPA挑战赛到特斯拉中国无人驾驶技术的现状谷歌的加入与优步的竞争深度学习的到来与特斯拉的独特优势无人驾驶的未来:机遇与挑战总结前言 今天,我想通过讲一个故事,帮助大家更好地理解无人驾…

MCU面试题

面试题 1、Crotex-M 处理器才用的架构是"v7" Cortex-M3处理器是基于ARMv7-M架构的处理器&#xff0c;支持更丰富的指令集&#xff0c;包括许多32位指令&#xff0c;这些指令可以高效的使用高位寄存器。另外&#xff0c;M3还支持&#xff1a; 查表跳转指令和条件执行&…

基于多设计模式下的同步异步日志系统

目录 一、项目介绍 1.1 项目功能 1.2 开发环境 1.3 核心技术 1.4 环境搭建 二、日志系统介绍 2.1 日志系统存在的必要性 2.2 日志系统的技术实现 三、相关技术知识的补充 3.1 不定参函数的使用 3.2 设计模式 四、日志系统框架设计 4.1 模块划分 4.2 模块关系图 …

C# 选择导入文件的路径、导出文件的路径

通过C#代码&#xff0c;调出windows风格的文件选择对话框和存储文件对话框。提供界面来选择文件的位置&#xff0c;并将完整路径以字符串形式返回。 1、选择导入文件&#xff0c;获取其路径 C#通过这段代码将弹出一个文件选择对话框&#xff0c;允许用户选择一个文件&#xff…

【Hadoop实训】Hive 数据操作①

目录 一、准备文件 1、创建表 2、 数据映射 二、HIVE的数据操作 1、基本查询 a、全表查询 b、选择特定字段查询 c、查询员工表总人数 d、查询员工表总工资额 e、查询5条员工表的信息 2、Where条件查询 a、查询工资等于5000的所有员工 b、查询工资在500到1000的员工信息 …

Kylin Server V10 下自动安装并配置Kafka

Kafka是一个分布式的、分区的、多副本的消息发布-订阅系统&#xff0c;它提供了类似于JMS的特性&#xff0c;但在设计上完全不同&#xff0c;它具有消息持久化、高吞吐、分布式、多客户端支持、实时等特性&#xff0c;适用于离线和在线的消息消费&#xff0c;如常规的消息收集、…

goroutine 介绍

引子&#xff1a; 线程比如打开腾讯视频然后开始下载多个视频&#xff0c;下载任务就是线程 但是这并不是同时进行的&#xff0c;只是时间片比较短切换的比较快 进程和线程的关系 有些程序可以多进程有些可能不支持 并发和并行 并发和并行的根本区别是&#xff1a;并发在同一时…

AlphaProof IMO 2024 P1 in LEAN 之 简介

AlphaProof 是用于进行数学证明的人工智能&#xff0c;其中&#xff0c;对于 IMO 2024 中的6道题中的 4 道。本系列博文&#xff0c;就 AlphaProof 对于 IMO 2024 P1 给出的答案进行详细讲述。这里是此系列的第一篇。 IMO 2024 P1 题目如下&#xff1a; IMO 2024 P1 答案 α 为…

Android Framework AMS(11)广播组件分析-2(注册/注销流程解读)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读广播组件的动态注册/注销过程及静态注册过程。关注思维导图中左上侧部分即可。 有了前面startActivity流程和service组件启动流程分…

Llamaindex RAG 实践

大模型支持的最强大的应用程序之一是复杂的问答聊天机器人。这些应用程序可以回答有关特定源信息的问题。这些应用程序使用一种称为检索增强生成 &#xff08;RAG&#xff09; 的技术。 1. 什么是RAG&#xff1f; 当你需要给模型注入新的知识时&#xff0c;有两种方法&#xf…

C#基础入门--类的建立与使用

上周刚开C#&#xff0c;这门课&#xff0c;第一节课就感觉不对劲了&#xff0c;感觉跟java很像(上图C#&#xff0c;下图java),进来页面都差不多&#xff1a; 这里介绍以下我C#的第一个程序&#xff0c;以类的思想定义一个student类&#xff0c;用户输入类中的属性信息后&#x…

LangChain Ollama实战文献检索助手(二)少样本提示FewShotPromptTemplate示例选择器

本期是用样例来提示大模型生成我们想要的答案。即在输入中给定提示的样例&#xff0c;以及提示模板&#xff0c;然后匹配较相关的样例进行文献综述。 创建示例样本FewShotPromptTemplate 这里我用GTP-o1生成了几个回答&#xff0c;作为样本 samples [{"theme": &…