补题报告5

news/2024/12/21 21:12:23/文章来源:https://www.cnblogs.com/Picecone-zzs/p/18448426

背景

2024-10-5做 \(CSP-J\) 复赛模拟,作补题报告。

成绩

  • \(T1\) \(AC\)
  • \(T2\) \(40\)
  • \(T3\) \(0\)
  • \(T4\) \(0\)

\(T1\) 牛奶 (\(milk\))

经典 \(T1\) 赛时 \(A\).

概述

要采购牛奶,有\(n\)种,每种有各自的\(a_i\)\(b_i\),需要\(m\)盒,求最小花销

思路

题目描述中说,作为一只学过动态规划的猫,就往 \(DP\) 方面想了想,最后还是做了贪心
其实很基础,先按价格从大到小排序,
如果 \(a_i\)\(m\) 大,花费加上 \(m \times b_i\)
否则,花费加上 \(a_i \times b_i\) , \(m\) 减去 \(a_i\)
\(m\leqslant 0\) ,结束计算

代码

Code
#include <cstdio>
#include <iostream>
#include <algorithm>
typedef long long ll;using namespace std;0
const int maxn = 1e5+111;struct node {int sum;ll cost;
} e[maxn];
int n,m;
ll ans;bool cmp(node x,node y) {return x.cost < y.cost;
}signed main() {
//	freopen("milk.in","r",stdin);
//	freopen("milk.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1; i<=n; ++i)scanf("%d%lld",&e[i].sum,&e[i].cost);sort(e+1,e+n+1,cmp);for(int i=1; i<=n; ++i) {if(m <= 0) break;ans += min(e[i].sum,m) * e[i].cost;m -= e[i].sum;}printf("%lld",ans); //	fclose(stdin);
//	fclose(stdout);return 0;
}

\(T2\) 树组 (\(Traary\))

推规律,推出来,过样例,40分(悲

概述

\(n\)棵树苗,在数组每个位置种上,每天过后,会增加\(1\)单位长度。
种树持续\(m\)天,你有魔法,在每天早上,有\(3\)种操作:
\(op = 1\) : 对树\(x\)施魔法,效果持续 \(k\)天,若之前该树就有魔法,覆盖(即取消上次,加上这次);;
\(op = 2\) : 对树\(x\)祛魔,可能会对没有施魔法的树使用;
\(op = 3\) :查询树\(x\)的高度。

\(op = 3\) 时,输出该树高度。

思路

每次操作,都对当前树进行处理,用 \(cnt\) 数组当前魔法生长阶段增加了多少
输出时加上
虽然但是 40分

代码

Code(错)
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 2e5+9999;int n,m,k;
int cnt[maxn];//记录操作该树之前总共额外加了多少 
pair <int,int> p[maxn];//记录每次使用魔法的初始时间和结束时间 
int tag[maxn];//标记上次操作节点 
signed main() {
//	freopen("traary.in","r",stdin);
//	freopen("traary.out","w",stdout);scanf("%d%d%d",&n,&m,&k);for(int i=1; i<=m; ++i) {int op,x;scanf("%d%d",&op,&x);if(op == 1) {if(p[x].first != 0 && p[x].second != 0) {//玄学记录 cnt[x] += min(i,p[x].second+1)-max(p[x].first,tag[x]);//打标记 tag[x] = i;}p[x].first = i;p[x].second = k + i - 1;} else if(op == 2) {if(p[x].first != 0 && p[x].second != 0) {cnt[x] += min(i,p[x].second+1)-max(p[x].first,tag[x]);tag[x] = i;}p[x].first = 0;p[x].second = 0;} else if(op == 3) {if(p[x].first != 0 && p[x].second != 0) {cnt[x] += min(i,p[x].second+1)-max(p[x].first,tag[x]);tag[x] = i;}printf("%d\n",i-1+cnt[x]);}}//	fclose(stdin);
//	fclose(stdout);return 0;
}

正解

也是我的思路
但是代码是对的 :)

代码

#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 1e5+1111;int n,m,k;
int a[maxn];
vector <pair<int,int> >v[maxn];
int ans[maxn];
int main(){memset(ans,-1,sizeof(ans));scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;++i){int op,x;scanf("%d%d",&op,&x);v[x].push_back({op,i});} for(int i=1;i<=n;++i){int tag = -1;int add = 0;for(int j=0;j<v[i].size();++j){int x = v[i][j].first;int y = v[i][j].second;if(x==1){if(tag > 0) add += min(y-tag,k);tag = y;}else if(x==2){if(tag > 0) add += min(y-tag,k);tag = -1; }else{ans[y] = y - 1 + add + (tag > 0 ? min(y-tag,k) : 0); }}}for(int i=1;i<=m;++i)if(ans[i] >= 0) printf("%d\n",ans[i]);return 0;
} 

\(T3\) 智乃的兔子(\(usagi\))

\(0\)

概述

要采购牛奶,有\(n\)种,每种有各自的\(a_i\)\(b_i\),需要\(m\)盒,求最小花销

思路

赛时想骗分,结果\(0\)

正解

\(01\) 背包+ \(k\) 约束
状态转移方程: \(f[i][j] = \max(f[i][j][k],f[i-1][j-b[i]][k-a[i]])\)
虽然但是,\([k]\)这一维没啥用,可以压了

代码

正解代码
#include <cstdio>
#include <iostream>
#define ll long long
#define maxn 1e4+111
#define maxh 1100
using namespace std;
int n,m;
int a[maxn],b[maxn];
ll t[maxn][7],f[maxh][7],g[maxh][7];int main() {scanf("%d%d",&n,&m);for(int i=1; i<=n; ++i)scanf("%d",&a[i]);for(int i=1; i<=n; ++i)scanf("%d",&b[i]);if(m == 998244353) { //特判for(int i=1; i<7; ++i)t[0][i] = -1e18;for(int i=1; i<=n; ++i) {for(int j=0; j<7; ++j) {t[i][j] = max(t[i-1][((j-a[i])%7+7)%7] + a[i],t[i-1][j]);}}cout << t[n][0];return 0;}for(int i=0; i<maxh; ++i) {for(int j=0; j<7; ++j)g[i][j] = -1e18;}g[0][0] = 0;for(int i=1; i<=n; ++i) {for(int w=0; w<=m; ++w) {for(int j=0; j<7; ++j) {f[w][j] = g[w][j];if(w >= b[i])f[w][j] = max(g[w-b[i]][((j-a[i])%7+7)%7] + a[i],f[w][j]);}}swap(f,g);}ll ans = 0;for(int i=0; i<=m; ++i)ans = max(ans,g[i][0]);cout << ans;return 0;
}

\(T4\) 一颗成熟的奥术飞弹(\(missiles\))

\(0\)

概述

有一个连通无向图,点是\(1\)~\(n\),这个飞弹要从\(1\)飞到\(n\),求最短飞行弹道条数和最大的可能偏离数。

\(PS\) : 可能偏离数怎么算 : 在一个点上,如果有多条最短路径到达终点,则可能偏离数\(+1\)

思路

依然骗分\(0\)分。

正解

最短路计数
进行\(2\)次广搜( \(BFS\) )
第一次:记录点 \(i\) 到点 \(n\)的最短路长度
第二次:以 \(n\) 为起点,宽搜每个点,求出 \(n\) 到每个点的最短路,同时标记父亲方便计算可能偏离数。
最后求 \(1\)\(n\) 的的最短路计数!

代码

Code
#include <queue>
#include <cstdio>
#include <vector>
#include <iostream>
#define ll long longusing namespace std;
const int maxn = 1e5+111;
int n,m;
queue <int> q;
bool vis[maxn];
vector <int> v;
vector <int> son[maxn];
int fa[maxn],dis[maxn],ans[maxn],cnt[maxn];
// 还是逆序记录
//经典BFS
void bfs() {q.push(n);vis[n] = 1;while(!q.empty()) {int x = q.front();q.pop();v.push_back(x);for(int i=0; i<son[x].size(); ++i) {int y = son[x][i];//y是x的邻接点if(!vis[y]) {vis[y] = 1;q.push(y);fa[y] = x;dis[y] = dis[x] + 1; //长度+1}}}
}signed main() {scanf("%d%d",&n,&m);for(int i=1; i<=m; ++i) {int x,y;scanf("%d%d",&x,&y);son[x].push_back(y);son[y].push_back(x);}bfs(); // 先进行一次广搜,记录fa数组、记录距离数组cnt[n] = 1;  // 记录最短飞行弹道条数for(int i=0; i<v.size(); ++i) {bool flag=0;int x = v[i];for(int j=0; j<son[x].size(); ++j) {if(dis[x] == dis[son[x][j]] + 1) {// 相邻两个点,距离也相差1,说明在最短路边上。ans[x] = max(ans[x],ans[son[x][j]]);cnt[x] += cnt[son[x][j]];// 所有能到son[vec[i]][j]的点都能走到vec[i]去,因此累加到vec[i]中。cnt[x] %= 998244353;if(son[x][j] != fa[x])// 记录时不能走回父亲点去flag = 1;}}ans[x] += flag;}printf("%d %d",cnt[1],ans[1]);return 0;
}

官方题解

后记

哈哈哈哈哈哈哈哈,集训结束咧!(大喜

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

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

相关文章

软件工程师课程辅导

Day1 环境搭建下载vscode下载链接:https://pan.baidu.com/s/1Oo1TIrAKmlEuEfdn9EXgLQ?pwd=nkt9配置vscode的python开发环境教程:https://www.runoob.com/python3/python-vscode-setup.html安装Pycharm下载教程:https://blog.csdn.net/qq_44809707/article/details/12250111…

PAIRDISTILL: 用于密集检索的成对相关性蒸馏方法

在当今海量数据时代,有效的信息检索(IR)技术对于从庞大数据集中提取相关信息至关重要。近年来,密集检索技术展现出了相比传统稀疏检索方法更加显著的效果。 现有的方法主要从点式重排序器中蒸馏知识,这些重排序器为文档分配绝对相关性分数,因此在进行比较时面临不一致性的挑战。…

School New Competition WP

试验一下博客园的基础功能,顺便把学校战队招新赛的Wp传一下, alpaca_search: 直接burp爆破把密码搞出来,在burp多抓几次包会在正确的包里发现一个新的cookie名count,count记录了正确的值 ,然后把它改成999再多发几次包,发到正确的那一个后就拿到了flag RCE_ME!!! 题目直…

pytorch环境安装

pytorch环境安装 1.基础安装 首先安装anaconda打开,进入base,输入命令,这里-n后跟的是环境名字,再往后是python版本,不要太高 conda create -n pytorch python=3.8安装的时候有按y的就按y 创建成功后使用下面命令进入创建的环境 conda activate pytorch2.安装需要的库 pip…

[Trick] 格路记数 - 反射容斥

Perface 模拟赛不会被冲烂了。 Problem I 从 \((0,0)\) 到 \((n,m)\) 方案数。 解法: \(C(n+m,m)\)。 Problem II 从 \((0,0)\) 到 \((n,m)\) 方案,但是不能经过 \(y=x+b\) 的直线。 解法: 考虑映射法。 以一条路径第一次碰到直线的位置为起点,之后所有的路线和 \(y=x+b\) …

Burp功能 细解析

情境 第六周的培训甚是有趣, 更加详细的介绍了Burp工具的功能和使用细节. 虽然很有趣, 但是我学得很慢, 练习达到熟练掌握还需要练习. 以下是第五次培训的练习题 以及我的解答. 最后一题手生, 一开始没做出来.1、安装burp,分别在本机上实现全局代理和局部代理,提供设置过程的…

高级语言程序设计第二次作业(102400106刘鑫语)

这个作业属于课程:https://edu.cnblogs.com/campus/fzu/2024C/ 作业要求:https://edu.cnblogs.com/campus/fzu/2024C/homework/13282 学号:102400106 姓名:刘鑫语 程序清单 最初都很顺利 3.1 3.2 3.3 3.4 3.5 3.6 出现了问题但一直没能解决,回宿舍后试着改成c99 依然报错,…

快乐数学4弧度

4 弧度 我们大多数人都不知道为什么圆要有 360 度。在学习高等数学或物理时,我们会记住一个神奇的数字--“圆的大小”,并将自己设置为一个 “圆的360度”。 专家们说:“弧度让数学变得更简单!”但却没有简单的理由(涉及泰勒级数的讨论并不简单)。今天,我们将揭开弧度的真…

序列化器ser.validated_data、ser.initial_data、ser.data

class LoginPwdSerializer(serializers.Serializer):mobile = serializers.CharField(required=True, validators=[RegexValidator(r"\d{11}", message="格式错误")])password = serializers.CharField(required=True)def validate_mobile(self, value):ex…

12-网络安全审计技术原理与应用

12.1 概述 1)概念 :指对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作。 作用:在于建立“事后”安全保障措施,保存网络安全事件及行为信息,为网络安全事件分析提供线索及证据,以便于发现潜在的网络安全威胁行为,开展网络安全风险分析及管理。 …

林史语其十(101-111)【下半更新】

12345鉴于收集素材与发布素材之间有一定延迟,此后林史一章分两次更新 先把存的旧东西发一下 #101故事源于 joke3579 学长博客里一份证明,涉及到求不定积分的 如果你不知道啥是不定积分,你只需要知道它是导数逆运算就行了 学长博客里写的是 :\(A\) 求导后等于 \(B\) HDK:\(…

林史语其十(101-110)【下半更新】

12345鉴于收集素材与发布素材之间有一定延迟,此后林史一章分两次更新 先把存的旧东西发一下 #101故事源于 joke3579 学长博客里一份证明,涉及到求不定积分的 如果你不知道啥是不定积分,你只需要知道它是导数逆运算就行了 学长博客里写的是 :\(A\) 求导后等于 \(B\) HDK:\(…