【学校训练记录】12月个人训练赛1个人题解

news/2025/2/12 11:57:06/文章来源:https://www.cnblogs.com/qkauto/p/18580012

A


对于n本书拿出k本较为难实现,但是从n本书里拿出n-k本就容易多了
对于n本书里拿一本为特殊情况,不管怎么拿都为0
对于n本书里拿n-k本的话,我们假设拿的最后一本为i那么
他就是拿出n-k-1本书的情况再加上拿出第i本的情况
其中差值变化为拿出n-k-1本书的值,加上我abs(w[i]-w[j])(j为拿出n-k-1本书情况的最后面的那本书)
将f[i][j]视为从i本书里拿出j本的最小差值
于是可以得到转移方程f[i][j] = min(f[i][j],f[l][j]+abs(w[i]-w[j]))
其中l为拿出j-1到i-1本书的情况

#include <bits/stdc++.h>
#define endl "\n"
#define int long long
using namespace std;struct sss{int l, r;
}w[110];
int n, k, f[110][110];
bool cmp(sss w1, sss w2){return w1.l<w2.l;
}
void solve(){cin >> n >> k;k = n-k;for(int i = 1; i <= n; i++) cin >> w[i].l >> w[i].r;for(int i = 1; i <= n; i++)for(int j = 1;j <= n; j++)f[i][j] = 1e18;sort(w+1,w+1+n,cmp);for(int i = 1; i <= n; i++) f[i][1] = 0;for(int i = 2; i <= n; i++){for(int j = 2; j <= min(i,k); j++)for(int l = j-1; l < i; l++)f[i][j]=min(f[i][j],f[l][j-1]+abs(w[i].r-w[l].r));}int mins  = 1e18;for(int i = k; i<=n; i++){mins = min(mins, f[i][k]);}cout << mins;
}
signed main (){ios::sync_with_stdio(false);cin.tie(nullptr); int T = 1;
//	cin >> T;while (T--) {solve();}return 0;
}

B


找出最大的两个值,与最大值相等就输出第二大的值,否则输出第一大的值

#include <bits/stdc++.h>
#define endl "\n"
#define int long long
using namespace std;int n, a[200010], b[200010]; 
void solve(){cin >> n;for(int i = 1; i <= n; i++){cin >> a[i];b[i] = a[i];}sort(b+1,b+1+n);for(int i = 1; i <= n; i++){if(a[i] == b[n]) cout << b[n-1] << endl;else cout << b[n] <<endl;}
}
signed main (){ios::sync_with_stdio(false);cin.tie(nullptr); int T = 1;
//	cin >> T;while (T--) {solve();}return 0;
}

C


考虑拿两种技能都能有的情况的值,第一个技能的最小花费和第二个技能的最小花费的值的和,输出他们的最小值即可。

#define endl "\n"
#define int long long
using namespace std;int n;
struct aaa{int num;string ch;
}w[200010];
bool cmp(aaa w1, aaa w2){if(w1.ch!=w2.ch){return w1.ch>w2.ch;}return w1.num<w2.num;
}
void solve(){cin >> n;for(int i = 1; i <= n; i++){cin >> w[i].num >> w[i].ch;}sort(w+1,w+1+n,cmp);int mins = 1e18;int j;for(j = 1; j <= n; j++){if(w[j].ch=="11"){mins = min(mins, w[j].num);}else break;}int ret = 1e18, p = 0;for(; j <= n; j++){if(w[j].ch=="10"){ret = min(ret, w[j].num);p = 1;}else break;}for(; j <= n; j++){if(w[j].ch == "01"){ret+=w[j].num;p = 2;break;}else break;}if(p==2)mins = min(mins, ret);if(mins == 1e18) cout << "-1" << endl;else cout << mins << endl;
}
signed main (){ios::sync_with_stdio(false);cin.tie(nullptr); int T = 1;cin >> T;while (T--) {solve();}return 0;
}```
#D
![](https://img2024.cnblogs.com/blog/3534879/202412/3534879-20241201163812206-576503710.png)
要求不重复的正整数,那就从1开始给,直到n值不允许再额外给出比他大1的值时,直接给出剩下的全部
```#include <bits/stdc++.h>
#define endl "\n"
#define int long long
using namespace std;int n, a[1100];
void solve(){cin >> n;int num = 0;for(int i = 1; i <= n; i++){if(n>=i+i+1){a[i] = i;num++;n-=i;}else{a[i] = n;num++;break;}}cout << num << endl;for(int i = 1; i <= num; i++){cout << a[i];if(i!=num) cout << ' ';}
}
signed main (){ios::sync_with_stdio(false);cin.tie(nullptr); int T = 1;
//	cin >> T;while (T--) {solve();}return 0;
}```
#E
![](https://img2024.cnblogs.com/blog/3534879/202412/3534879-20241201163841557-1929111736.png)
根据题意可以得到f(i)<=g(i)是一定成立的,因为比他大的数的数量加一 跟 比他大的数的数量加上自身是一样大的,若再加上其他与自身相等的数就是大于的情况了
那剩下需要考虑的就只有k的情况
那么对于ai刚好等于ak的情况,我们就不需要操作。
对于ai大于ak的情况,即k可能大于g(i)的情况,就需要把比他小的值到ak的值全部变为自身即可。(此处需要前缀和来维护)
对于ai小于ak的情况,即k可能小于f(i)的情况,就需要把ai变成ak即可
```#include <bits/stdc++.h>
#define endl "\n"
#define int long long
using namespace std;struct sss{int num;int p;
}w[500010];
int n, k;
bool cmp(sss w1, sss w2){return w1.num>w2.num;
}
int sum[500010], ret[500010];
void solve(){int xxxx;cin >> xxxx >> n >> k;for(int i = 1; i <= n; i++){cin >> w[i].num;w[i].p = i;}sort(w+1,w+1+n, cmp);for(int i = 1; i <= n; i++) sum[i] = sum[i-1]+w[i].num;for(int i = 1; i <= n; i++){if(w[i].num == w[k].num) ret[w[i].p] = 0;else if(w[i].num > w[k].num){ret[w[i].p] = w[i].num*(k-i)-sum[k]+sum[i];
//			cout << w[i].num << ' ' << k << ' ' << i << ' ' << sum[k] << ' ' << sum[i] << endl;}else if(w[i].num < w[k].num) ret[w[i].p] = w[k].num-w[i].num;}for(int i = 1; i <= n; i++){cout << ret[i] << endl;}
}
signed main (){ios::sync_with_stdio(false);cin.tie(nullptr); int T = 1;
//	cin >> T;while (T--) {solve();}return 0;
}```

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL底层概述—7.优化原则及慢查询

大纲 1.Explain概述 2.Explain详解 3.索引优化数据准备 4.索引优化原则详解 5.慢查询设置与测试 6.慢查询SQL优化思路1.Explain概述 使用Explain关键字可以模拟查询优化器来执行SQL查询语句,从而知道MySQL是如何处理SQL语句的,从而分析出查询语句和表结构的性能瓶颈。MySQL查…

升鲜宝生鲜配送供应链管理系统Mysql表结构数据字典的生成小工具V0.01

最近最近要交付升鲜宝生鲜配送供应链管理系统源代码给上海的客户,需要将蓝湖UI设计图及数据字典交接给别人。在网上找了半天没有找到合适的根据Mysql生成Word数据字典,自己就写了几行代码,记录一下.后面可能会继续改造。主要的代码如下:using System; using System.Collect…

非递归线段树实现

ZKW 非递归线段树 参考文章:线段树详解(非递归版)_非递归线段树-CSDN博客 建树: 原数组[1,n] 存在线段树的 [2,n+1] (为了方便区间查询,要空出第一个节点和最后一个节点) 区间查询 若查询[L,R] 区间, 选取L-1和 R+1 两个节点, 向上寻找.每次到达父节点 L-1 查看自己的父亲的右…

hot100-一刷-01哈希(共3道题)

1.两数之和 题目链接 题目描述代码实现 分析:暴力的话就是两个for循环依次寻找相加为target的两个数。 用一个map记录已经遍历过的数,其中key就用这个数的字面值,value就存它的下标。 判断是否相加为taget的时候,只需要看map中是否有target-nums[i]就可以,说明当前的nums[…

Activiti 学习笔记

工作流概述 每一项业务的开始和结束,都可以理解为一个工作流,例如,公司的费用报销的基本流程如下:员工先提出费用报销申请,提交给部门领导,部门领导审批后,提交给财务部门审批,审批完成后,通知提出申请的员工可以报销,报销流程结束。整个流程按照步骤完成,这就是一个…

高级程序语言设计课第九次作业

14.17.314.17.414.17.514.17.1014.17.1114.18.314.18.4 a: b: 14.18.5

WEB AK赛-web1_观字

对这段代码进行解析: substr($url, 0, 7) 截取url变量前7位判断是否是http协议 preg_match() 正则表达式检查 URL 中是否包含一些潜在的危险字符: 过滤了:., ;, |, <, >, *, %, ^, () 这题只需要绕过"."即可。 尝试使用url编码不可以 在curl中可以使用"…

Fail pg walkthrough Intermediate

nmap ┌──(root㉿kali)-[/home/ftpuserr] └─# nmap -p- -A 192.168.159.126 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-01 02:54 UTC Nmap scan report for 192.168.159.126 Host is up (0.071s latency). Not shown: 65533 closed tcp ports (reset) PORT …

通过实现 FactoryBean 接口注入 Bean

原文:如何使用 Spring 的 FactoryBean 接口在 Spring 容器中有两类的 Bean,一类是普通的 Bean,一类是工厂 Bean。这两种 Bean 都是被 Spring 的容器进行管理的。而 Spring 也提供了一个接口用于扩展工厂 Bean,我们只要实现org.springframework.beans.factory.FactoryBean即…

探索古诺尔斯语:揭开维京时代语言的神秘面纱

在历史的长河中,有一些语言以其独特的文化和历史价值,成为语言学家、历史学家乃至文学爱好者研究的宝贵资源。古诺尔斯语,作为现代北欧语言的祖先,正是这样一个充满魅力的语言。它不仅是冰岛语、瑞典语、挪威语、丹麦语、法罗语和艾尔夫达利语的源头,更是维京时代斯堪的纳…

探索古英语的奥秘:一部语言的时光机

在历史的长河中,语言如同一条蜿蜒的河流,承载着文化的变迁和人类的智慧。古英语,作为英语的早期形式,不仅见证了中世纪英格兰的辉煌,更是现代英语的根基。它如同一部时光机,带我们穿梭回那个英雄与传说并存的时代,让我们得以窥见语言的原始面貌和文化的魅力。古英语:语…

【Altium Designer 25.0.2下载与安装教程】

1、安装包 「AltiumDesigner v25.0.2.28.rar」 链接:https://pan.quark.cn/s/babcbc39d4b1 提取码:EPis 2、安装教程(建议关闭杀毒软件和系统防护) 1) 下载并解压下载的安装包,右击Installer.exe安装,弹窗安装对话框2) 点击Next3) 选择语言Chinese,I…