首页 > 其他分享 >补题报告5

补题报告5

时间:2024-10-05 20:21:57浏览次数:7  
标签:报告 int ll tag maxn 补题 ans include

背景

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\),
如果祝福值超过 \(H\),就会被吃!
求,怎么挑选兔子,是可爱值和为\(7\)的倍数可爱和最大还不会被吃掉

正解

\(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 long

using 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;
}

官方题解

后记

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

标签:报告,int,ll,tag,maxn,补题,ans,include
From: https://www.cnblogs.com/Picecone-zzs/p/18448426

相关文章

  • [论文阅读报告] All pairs shortest paths using bridging sets and rectangular matr
    本篇文章介绍整数边权下\((\min,+)\)矩阵乘、APSP等问题的一些做法。若每个元素的权值在\([-M,M]\cap\mathbbZ\)中,\(n\timesn^r\)和\(n^r\timesn\)的\((\min,+)\)矩阵乘可做到\(\tildeO(Mn^{\omega(r)})\);有向图APSP可做到\(\tildeO(n^{2+\mu(t)})\),......
  • 20222312 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.1实验目标本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这......
  • 补题报告4
    背景CSP-J模拟赛考得最好的一次得分\(T1\):\(AC\)\(T2\):\(AC\)\(T3\):\(0\)\(T4\):\(20\)总分:\(220\)致敬传奇\(180\)分以上就请吃饭的......
  • KDY-二轮模拟-ZHX补题报告
    1.比赛情况T1三个T2合体T3矩形T4数对总分100pts70pts20pts20pts210pts2.赛中概况第一第二题比较简单,用了1小时搞定。(第一题全体AK)第3,4题难度飙升,想了好久最后改用暴力,共得40分,符合预期。3.题目解析 T1暴力出奇迹1.1问题描述现在科学家在培养 A,B,C三种微生......
  • 基于django+vue+Vue的高校设备信息管理系统的设计与实现【开题报告+程序+论文】-计算
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高校教育事业的蓬勃发展,各类教学科研设备的数量急剧增加,设备信息管理成为高校管理中的重要环节。传统的人工管理方式不仅效率低下,而且......
  • 基于django+vue+Vue的高校教师多维考核评价系统设计开发与实现【开题报告+程序+论文】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的快速发展,高校教师的工作内容与职责日益复杂多样,传统的单一维度评价体系已难以满足当前对高校教师全面、公正评价的需求。近......
  • 基于django+vue+Vue的房屋租借系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人口流动性的增强,房屋租借市场日益繁荣,成为满足人们居住需求的重要途径。然而,传统的房屋租借方式往往依赖于中介或......
  • # 20222423 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容1.1知识回顾本周内容主要通过学习了解到缓冲区溢出攻击的基本原理,同时也复习和加深了对于计算机中有关栈、堆、缓冲区等知识的印象。另外通过动手实践,掌握学习了解了以下知识:基本的汇编语言如(mov、push、pop、call等),弄够理解其基本功能知道esp、eip、ebp等寄存......
  • 10 月 3 日解题报告
    10月3日题解Tasklist[T1]ARC_134_C[T2]ARC_108_D[T3]ARC_137_C[T4]ARC_064_E[T1]ARC_134_CTheMajority题目因为原翻译有些重点并没有点出来,所以这里给出原题直译而不是带有《原神》游戏专业术语的转译版本。有编号为\(1\)到\(K\)的\(K\)个盒子。最初,所有......
  • CSP-J模拟赛一补题报告
    IAKIOI!!!前言考的最好的一回:240pts首先开T1,45min干掉了然后T2,45min挂了然后T3,40min又挂了然后发呆了一会把T4骗分打了,此时已过去一坤时40minT2切了,最后20min打了T3骗分又发呆了一会T1:100ptsT2:100ptsT3:30ptsT4:10pts《正文》01011010101001010010101011010100011......