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

2024.2.25 模拟赛

时间:2024-04-05 20:55:18浏览次数:19  
标签:std 25 2024.2 val int scanf ans fl 模拟

A

按题意直接模拟即可。也就是每次取出一些字符,放入字符串\(P\)中。

注意实现时的时间复杂度,不要写成 \(O(n^2)\) 的。

#include<bits/stdc++.h>
using namespace std;
char s[1000010],t[1000010];
int hd1=1,hd2=1,n,m,x,y;
char ans[2000010];
int main()
{
	scanf("%s",s+1);n=strlen(s+1);
	scanf("%s",t+1);m=strlen(t+1);
	scanf("%d%d",&x,&y);
	while(hd1<=n||hd2<=m)
	{
		for(int i=1;hd1<=n&&i<=x;i++)
			putchar(s[hd1++]);
		for(int i=1;hd2<=m&&i<=y;i++)		
			putchar(t[hd2++]);
	} 
}

B

发现一定是小羊优先匹配小牛,小牛匹配小羊,并且今日准备饼干数量多的店主优先匹配,最后可能还会剩下一些无法匹配的店主。

可以先分类再排序,然后贪心选择就可以取到最大值。

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct item
{
	int tp,val;
};
item a[100010];
long long ans=0;
bool cmp(item x,item y)
{
	if(x.tp!=y.tp)
		return x.tp<y.tp;
	return x.val>y.val;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&a[i].tp,&a[i].val);
	sort(a+1,a+n+1,cmp);
	int c0=m,c1=n-m;
	for(int i=1;i<=n;i++)
	{
		if(a[i].tp==1)
		{
			if(c0>0)
				c0--,ans+=a[i].val*2;
			else
				c1--,ans+=a[i].val; 
		}
		else
		{
			if(c1>0)
				c1--,ans+=a[i].val*1.5;
			else
				c0--,ans+=a[i].val;
		}
	}
	printf("%lld\n",ans);
}

C

考虑 \(C_{i,j}\) 和 \(C_{i,j+1}\) 的差为 \(|A_i+B_j-A_i-B_{j+1}|\) ,也就是 \(|B_j-B_{j+1}|\) ,\(C_{i+1,j}\) 同理。

由此可发现,走回头路一定不优,且所有只向右和向下的方案代价都一样,所以答案就是 \(\sum_{i=1}^{n-1}|A_i-A_{i+1}|+\sum_{i=1}^{m-1}|B_i-B_{i+1}|\)

#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[1000010], b[1000010];
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (int i = 1; i <= m; i++) scanf("%d", &b[i]);
    long long sum = 0;
    for (int i = 2; i <= n; i++) sum += abs(a[i] - a[i - 1]);
    for (int i = 2; i <= m; i++) sum += abs(b[i] - b[i - 1]);
    printf("%lld\n", sum);
}

D

考虑记录每个士兵是否得到了军令。

将所有时间按照时间顺序排序后,按时间顺序模拟所有事件的发生即可,即如果两个士兵中有一个得到了消息,则记录下另一个士兵得到消息的信息。

#include<bits/stdc++.h>
using namespace std;
int n,m;
int t;
bool vis[1000010];
struct event
{
	int x,y;
	double ti;
};
bool cmp(event x,event y)
{
	return x.ti<y.ti;
}
event p[500010];
int cnt=0;
int a[100010],b[100010];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		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]);
		for(int i=1;i<=n;i++)
			vis[i]=0;
		cnt=0;
		vis[m]=1;
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++)
			{
				if(a[i]==a[j])
					p[++cnt]=(event){i,j,0};
				else if(b[i]!=b[j]&&(a[i]>a[j])!=(b[i]>b[j]))
					p[++cnt]=(event){i,j,1.0*(a[i]-a[j])/(b[j]-b[i])};
			}
		sort(p+1,p+cnt+1,cmp);
		for(int i=1;i<=cnt;i++)
			vis[p[i].x]|=vis[p[i].y]|=vis[p[i].x];
		int ans=0;
		for(int i=1;i<=n;i++)
			ans+=vis[i];
		printf("%d\n",ans);
	} 
}

E

考虑每一位的贡献是独立的, 那么可以分别对每一位做。

从左到右扫一遍, 对每一位维护两个值, 分别表示当前总共有多少个 \(1\) , 当前异或起来总共有多少个 \(1\) , 即维护了 \(a_i\) 以及 \(a_i \oplus a_j\) 。

可能稍微有点卡常, 可以参考 std。

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int n, k;
ull a[4000005], ans, U, seed;
int main() {
	scanf("%d%llu%d", &n, &seed, &k);
	srand(seed);
	U = (k == 64 ? 0ull : (1ull << k)) - 1ull;
	mt19937_64 rnd(seed);
	for(int i = 1; i <= n; i++) a[i] = rnd() & U;
	ull ans = 0;
	for(int i = 0; i < k; i++) {
		ull cnt0 = 0, cnt1 = 0, t = 0, res = 0;
		for(int j = 1; j <= n; j++) {
			bool fl = (a[j] >> i) & 1;
			res += fl * 1ull * (j - 2) * (j - 1) / 2 + (!fl) * t, cnt1 += fl, cnt0 += !fl, t += fl * cnt0 + (!fl) * cnt1;
		}
		ans += res * (1ull << i);
	}
	printf("%llu\n", ans);
	return 0;
}

标签:std,25,2024.2,val,int,scanf,ans,fl,模拟
From: https://www.cnblogs.com/xhqdmmz/p/18116170

相关文章

  • [C++][C++11][智能指针]分析详解 + 代码模拟
    目录0.智能指针三要素:)1.为什么需要智能指针?2.内存泄漏1.什么是内存泄漏?内存泄漏的危害?2.内存泄漏分类(了解)3.如何检测内存泄漏4.如何避免内存泄漏3.RAII4.智能指针原理5.auto_ptr(失败设计)6.unique_ptr7.shared_ptr1.实现原理:通过引用计数的方式来实现多个shared_ptr......
  • 模拟赛总结
    23-24term19.17最可惜的是t4:把b放在a后面就形成了一个长为2*m的LIS。我想到了LIS但是一直觉得无法保证长度为m所以直接hack掉自己的想法。。(虽然LIS时间复杂度10^7理论是可以过的。)太可惜了。当然也可以搜索剪枝(你是傻子你不会dfs你别想了)T2:转移方程脑子炸了想了好久,然后还没......
  • Cisco ACI Simulator 6.0(5h) - ACI 模拟器
    CiscoACISimulator6.0(5h)-ACI模拟器ApplicationCentricInfrastructure(ACI)SimulatorSoftware请访问原文链接:https://sysin.org/blog/cisco-acisim-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgACISimulator介绍思科以应用为中心的基础设施(ACI......
  • Qt模拟面试(超硬核)
    1.请简要介绍一下你的Qt开发经验。建议:诚实地描述你的Qt经验,包括你使用过的Qt版本、开发过的项目类型、遇到的挑战以及如何解决它们。假如你没有开发经验,可以提供一些关于Qt开发的一般信息和常见的经验分享。Qt是一个跨平台的应用程序开发框架,它提供了丰富的工具......
  • P8025 【树链剖分求祖先】
    P8025【树链剖分求祖先】这题的题意简单,简单分类讨论一下这里就不赘述了。最后题目就简化成求一个点的\(k\)级祖先。开始会的解法是倍增,但是常数过高被卡了。常数更优秀的做法是树剖,每一次跳树链,最后可能有一条链太长只能跳一部分,这是因为树链剖分的\(dfn\)序是有序的,即每......
  • 25考研数一高数第一轮复习(3):数列极限
    一、数列的概念对每个,如果按照某一法则,对应着一个确定的实数,这些实数按照下标从小到大排列得到的一个序列就叫作数列,简记为数列数列中的每一个数叫作数列的项,第项叫作数列的一般项(或通项)在几何上,数列可看作数轴上的一个动点,它依次取数轴上的点数列可看作自变量为正......
  • 2024.3.30 模拟赛
    A数列删除至少删除\(m\)个数,意思就是最多保留\(n-m\)个数。删除的总和最小,意思就是保留的总和最大。非降子序列问题可以用经典的动态规划来解决。用\(f[i][j]\)表示,当前选的最后一个数是\(a[i]\),一共选了\(j\)个数,选的数总和最大是多少。转移就是枚举上一个数\(a[......
  • c语言:模拟字符串拷贝功能(strcpy),面试题
    面试题:优化中的优化(10分满分)字符串拷贝:是将一个字符串的内容复制到另一个字符串中的操作。运用函数模拟字符串拷贝:(5分)模拟字符串拷贝#include<stdio.h>voidmy_strcpy(char*dest,char*str){ while(*str!='\0') { *dest=*str; str++; dest++; } *dest......
  • Java游戏开发基础:从零开始搭建自己的游戏之《人生重开模拟器》简易版
    一、引言人生重开模拟器游戏是一种虚拟角色扮演游戏,玩家通过控制一个虚构的角色,体验与现实生活中不同的选择和结果。玩家的决策将影响角色的生活轨迹,包括他们的职业生涯、社交关系、健康和财富等方面。游戏的乐趣在于提供了一个虚拟的沙盒环境,玩家可以尝试不同的生活选择,而......
  • Autodesk Maya 2025 Multilanguage (macOS, Linux, Windows) - 三维动画和视觉特效软
    AutodeskMaya2025Multilanguage(macOS,Linux,Windows)-三维动画和视觉特效软件三维计算机动画、建模、仿真和渲染软件请访问原文链接:https://sysin.org/blog/autodesk-maya/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org三维计算机动画、建模、仿真和渲染......