首页 > 其他分享 >2024.10.15 模拟赛

2024.10.15 模拟赛

时间:2024-10-15 21:44:17浏览次数:1  
标签:2024.10 15 int rint 元素 cnt 队列 模拟 define

2024.10.15 模拟赛

T1 count

简要题意

给定一个长度为 \(n\) 的数组求其中正整数数量,\(n≤100\)

solution

哇,还是太难了

输入的时候如果是正数就 cnt++ 输出 \(cnt\) 即可

人机题,不放代码了

T2 sigma

简要题意

给定 \(n\) 个双端队列,其中第 \(i\) 个队列内有 \(c_i\) 个整数元素。进行 \(m\) 次弹出操作。每次操作可以任意选定一个队列,并将其头部或尾部的元素弹出。希望弹出的 \(m\) 个元素的和尽可能大。计算并输出这个最大元素和。

solution

非常好 dp,很难想到是背包

设 \(f[i]\) 表示弹出个数不超过 \(i\) 的最大元素和,\(w[i][j]\) 表示第 \(i\) 组共弹出 \(j\) 个数的最大元素和。

根据背包 dp 的性质,根本不需要当前队列顺序,从第一个队列开始算就行了,对于每一个队列 dp 一遍就行。操作次数是体积,元素是价值。

那么显然有转移方程

\[f_j=\max\{f_j,f_{j-k}+w_{i,k}\} \]

问题在于我们的 \(w\) 怎么求。对于第 \(i\) 的队列,所有元素和显然为 \(s_{c_i}\),减去前 \(r\) 在加上前 \(l\) 就是弹出部分。所以为 s[c[i]]-s[r]+s[l-1],那么 \(w\) 取个 \(max\) 就可以了。

复杂度 \(O(n^2m)\),显然跑不满,所以能过

#include <bits/stdc++.h>

#define rint register int
#define int long long
#define endl '\n'

using namespace std;

const int N = 1e2 + 5;
const int M = 1e5 + 5;

int n, m;
int f[M], w[N][N];
/*
f[i]     弹出个数不超过 i 的最大元素和
w[i][j]  第 i 组共弹出 j 个数的最大元素和
*/
int s[N];

signed main() 
{
	cin >> n >> m;
	for (rint i = 1; i <= n; i++) 
	{
		int t;
		cin >> t;
		for (rint j = 1; j <= t; j++) 
		{
			int x;
			cin >> x;
			s[j] = s[j - 1] + x;
		}
		for (rint j = 1; j <= t; j++)
		{
			for (rint l = 1; l <= j + 1; l++) 
			{
				//t - j = r - l + 1
				int r = t + l - 1 - j;
				w[i][j] = max(w[i][j], s[t] - s[r] + s[l - 1]);
			}			
		}
		for (rint j = m; j >= 0; j--)
			for (rint k = 0; k <= j && k <= t; k++)
				f[j] = max(f[j], f[j - k] + w[i][k]);
	}
	cout << f[m] << endl;
	return 0;
}

T3 move

简要题意

对于两个字符串 \(a,b\),使用恰好 \(k\) 次操作使 \(a\) 变成 \(b\),操作为将字符串从中间任意位置截断,得到前后两个非空子串。将两个子串交换位置后重新连接,得到新字符串。(如将 abc -> a ,bc -> bca),求不同的方案数。\(n≤10^5,0≤k≤10^5\)

solution

神仙题!

我们将原字符串收尾相连,看成一个环。那么,每次操作,是不是就是将断开位置改变了?那么对于答案直接影响的就是最后一次操作你所在的位置是否是正确切割位置。由于操作必须改变原字符串,所以需要考虑断开位置每一次必须改变,否则可以直接乘法原理推式子。

考虑 dp,\(f[i][0]\) 表示对 \(a\) 进行恰好 \(i\) 次操作, 与 \(b\) 相同的方案数,\(f[i][1]\) 表示对 \(a\) 进行恰好 \(i\) 次操作, 与 \(b\) 不同的方案数。

我们先要求出一个 cnt 表示正确切割位置的数量。

那么 \(f[i][0]\),就暗示已经占用一个正确切割位置,由于每次必须改变位置,所以为 \((cnt-1)\times f[i-1][0]\),而对于 \(f[i-1][1]\),只要它下一步是 \(cnt\) 中的一个即可。那么转移为:

\[f_{i,0}=(cnt-1)\times f_{i-1,0}+cnt \times f_{i-1,1} \]

至于 \(f[i][1]\) 就同理即可

\[f_{i,1}=(len-cnt)\times f_{i-1,0}+(len-cnt-1)\times f_{i-1,1} \]

最终答案为 \(f_{k,0}\)

标程还写了个破环为链的过程,但我认为没有必要,因为这个环是假设的而且也说到了破换位置不能不变,所以不破环为链直接 dp 仍然具有正确性。

复杂度 \(O(n^2+k)\)

#include <bits/stdc++.h>

#define rint register int
#define int long long
#define endl '\n'

using namespace std;

const int N = 2e5 + 5;
const int mod = 1e9 + 7;

string a, b;
int k;
int f[N][2];
//f[i][0] 对 a 进行恰好 i 次操作, 与 b 相同的方案数
//f[i][1] 对 a 进行恰好 i 次操作, 与 b 不同的方案数

signed main()
{
	cin >> a >> b; cin >> k;
	int cnt = 0;
	if (a == b) cnt = 1;
	int len = a.size();
	for (rint i = len - 1; i >= 1; i--)
	    if (a.substr(i) + a.substr(0, i) == b)
	    // 从第 i 个字符往后 + 从 0 到 i 刚好是 b
	        cnt++;
	if (a == b) f[0][0] = 1;
	else f[0][1] = 1;
	for (rint i = 1; i <= k; i++)
	{
		// cnt - 1 是因为当前处于一个合法断开点不能原地踏步
		f[i][0] = ((cnt - 1) * f[i - 1][0] + cnt * f[i - 1][1]) % mod;
		f[i][1] = ((len - cnt) * f[i - 1][0] + (len - cnt - 1) * f[i - 1][1]) % mod;
	}
	cout << f[k][0] << endl;
	return 0;
}

标签:2024.10,15,int,rint,元素,cnt,队列,模拟,define
From: https://www.cnblogs.com/spaceswalker/p/18468553

相关文章

  • 10/15AWT组件学习(1)
    AWT组件学习(1)监听器常用组件布局publicstaticvoidmain(String[]args){Frameframe=newFrame();//Frame是窗体,我们只需要创建这样一个对象就可以了,这样就会直接创建一个新的窗口frame.setSize(500,300);//可以使用setSize方法设定窗体大小frame.setVisible(t......
  • 2024.10.12 模拟赛
    2024.10.12模拟赛T1delete简要题意给定长度为\(n\)的数列\(a_i\),每次操作需要选择\([l,r]\),满足\(a_l,a_{l+1},...a_{r}\)按位与的结果为\(0\),然后删去\([l,r]\),删去后左边和右边合并起来。问最多能合并多少次。\(n≤63,a_i≤63\)solution显然的,由于这个操作是按......
  • 2024.10.31 人工智能技术学 第三课时 AI
    预训练(前提基础)补充语料库微调:针对特定人任务的专门训练。——学科专业化推理:模型根据输入生成输出文本。——学生解答问题的过程生成式人工智能包括图像生成、音频生成、视频生成、文本生成海螺AI(很不错)文心一言kimi(写作业用)智谱清言CAJ可以读知乎论文PPTMINDSHOW:ht......
  • 20241015
    P1037易形迷宫(maze)我们可以转化一下题面,把胸口碎大石的功能换成幽灵,可以直接穿透石头,那么我们可以把炸碎石头改成可以向\(8\)个方向随便走\(k-1\)步,然后我们直接\(dij\)即可#include<bits/stdc++.h>usingnamespacestd;usingPii=pair<int,int>;consti......
  • P9150 邮箱题
    感觉是一道很好的图论题。首先,每个点只有一个钥匙,意味着我们点集的加入顺序是固定的。我们考虑暴力枚举每个起点,维护一个栈,考虑栈顶的强连通分量是否能连到下一个目标,如果能连到,就判断是否可以缩出新的强连通分量。这样子我们就能暴力求出每个点作为起点的答案了。显然,如果\(x......
  • 10月15日
    优化上次的四则运算代码;增加要求:1.添加四年级能够进行五位操作数以内运算;点击查看代码importjava.util.*;abstractclassMathProblem{protectedintmaxOperands;//最大操作数protectedbooleanallowMultiplication;//是否允许乘法protectedboolean......
  • 多校A层冲刺NOIP2024模拟赛07
    rank7,T1100pts,T20pts,T370pts,T416ptsaccoder上rank31,同分限速(speed)签,糖。打的\(O(m\logV)\)的。考虑分类讨论,有两种情况。最大值是由最小的转化过来的,那么就是看边权\(\lek\)的是否可以构成一颗最大生成树,时间复杂度\(O(m\logm)\)最大值是由更大的减下来的,发现......
  • 2024.10.15 比赛反思
    2024.10.15比赛反思其实我觉得有好几次我差一点就要写反思了,但是由于运气最后没有写(最极限的一次是倒数第五)。但是终究还是逃不过啊。首先是\(T1\)还比较正常,用了大概\(50\min\),没有浪费太多时间,这点比较好。但是后面就开始出现问题了。\(T2\)是一个网格图上的问题,其实感......
  • 多校A层冲刺NOIP2024模拟赛07
    多校A层冲刺NOIP2024模拟赛07\(T1\)A.限速(speed)\(40pts\)设最终保留的边的权值构成的集合为\(S\)。那么其贡献为\(\begin{cases}k-\max\limits_{x\inS}\{x\}&\max\limits_{x\inS}\{x\}\lek\\\sum\limits_{x\inS}[x>k]\times(x-k)&\max......
  • dll修复工具c2015更新失败怎么办?dll修复工具c2015更新失败详细解决步骤
    针对“dll修复工具c2015更新失败”的问题,这里提供一系列可能的解决方案。这些方案旨在帮助用户解决在尝试更新或修复VC2015相关的DLL文件时遇到的失败情况。请注意,以下步骤可能需要根据具体情况进行调整:一、检查系统更新确保系统最新:首先,确保Windows系统已安装所有可用的更......