首页 > 其他分享 >【垫底模拟】CSP模拟-6

【垫底模拟】CSP模拟-6

时间:2023-07-26 16:47:41浏览次数:36  
标签:cnt int 交换 xx maxn 垫底 CSP 模拟 逆序

新系列,系列名叫垫底模拟,厉害吧

T1 排序

最开始想的都是很简单的东西,就是把最大的数放到最后嘛,然后发现显然不行,比如说:

hack: 

input:
5
1 5 3 2 4

output:
3 4
2 5
2 4
2 3

题目很明显地告诉我们先输出逆序对数 \(m\) 再输出交换 \(m\) 行操作,这 \(m\) 次操作还必须针对我们求出的逆序对,怎么能直接把最大数放到最后捏?

然后冒泡也不行,因为你冒泡交换的一定是相邻的坐标,根本不是针对我们逆序对交换的。

拿上面的例子说:

这个题不是让我们 \(sort\) 然后输出怎么 \(sort\) 的,而是让我们真的交换所有逆序对而且最后结果也必须保持升序。

于是我思考是酱紫的:如果说,\((i,i+1)\) 与 \((i+1,i+2)\) 都是逆序对,优先交换 \((i+1,i+2)\),例如上面的数据 \(5,3,2\)。(当时感到非常得意,感觉马上就要AC)

然后就保龄了。

于是我们赛后重新理一下思路:

  • 对于一个排列,排列不会出现重复数,所以每个数最终的位置是已知的。

  • 考虑每组逆序对交换的顺序,因为我们要进行 \(m\) 次交换操作,所以我们的每次交换只能减少一次逆序对个数,要不然一定会少操作。

  • 我们可以通过类似离散化的方式得到每个数的大小排名。

然后考虑交换顺序问题:

拿上面的数据来举例:

\(sort\) \(1\) \(2\) \(3\) \(4\) \(5\)
\(a=\) \(1\) \(5\) \(3\) \(4\) \(2\)

对于 \(a=\) \(5>3,5>4\) 来说,我们应当优先交换 \(a(5,3)\),这样的话 \(a=5\) 仍在 \(a=4\) 前,否则就少了逆序对个数。

交换后:

\(sort\) \(1\) \(2\) \(3\) \(4\) \(5\)
\(a=\) \(1\) \(3\) \(5\) \(4\) \(2\)

对于 \(temp\) \(5>2,4>2\) 来说,我们应当优先交换 \(a(4,2)\),这样的话 \(a=5\) 仍在 \(a=2\) 前,否则就少了逆序对个数。

因此得到重要结论:当逆序对第一个数相等时,优先交换下标较小数。

当逆序对第二个数相等时,优先交换下标较大数。

然后是洛谷的题需要判重复。

有代码:

Miku's Code
#include<bits/stdc++.h>
using namespace std;

const int maxn=1e3+50;

int n,a[maxn],temp[maxn],ranking[maxn];
int sorta[maxn];
struct WORK{
	int x;
	int y;
};WORK w[maxn*1000];
int cnt;

bool cmp(WORK xx,WORK yy){
	if(xx.x==yy.x){
		if(ranking[xx.y]!=ranking[yy.y])	return ranking[xx.y]>ranking[yy.y];
		return xx.y>yy.y;
	}
	return xx.x<yy.x;

}

void input(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
		sorta[i]=a[i];
	}
	sort(sorta+1,sorta+1+n);
	//int len=unique(sorta+1,sorta+1+n)-(sorta+1);
	//len=n;
	for(int i=1;i<=n;++i){
		ranking[i]=lower_bound(sorta+1,sorta+1+n,a[i])-sorta;
	}
}

void get(){
	for(int i=1;i<=n;++i){
		for(int j=i+1;j<=n;++j){
			if(ranking[i]>ranking[j]){
				++cnt;
				w[cnt].x=i;
				w[cnt].y=j;
			}	
		}
	}
}

int main(){
	input();
	get();
	sort(w+1,w+1+cnt,cmp);
	printf("%d\n",cnt);
	for(int i=1;i<=cnt;++i){
		printf("%d %d\n",w[i].x,w[i].y);
	}
	return 0;
}

标签:cnt,int,交换,xx,maxn,垫底,CSP,模拟,逆序
From: https://www.cnblogs.com/sonnety-v0cali0d-kksk/p/17582871.html

相关文章

  • 视频直播系统源码,vue自定义模拟滚动条
    视频直播系统源码,vue自定义模拟滚动条vscroll自定义滚动条模板 <template> <divclass="vui__scrollbar"ref="ref__box"@mouseenter="handleMouseEnter"@mouseleave="handleMouseLeave"v-resize="handleResize">  <div:......
  • 2023 暑假集训模拟赛 Day 2
    比赛题目共2套,其中初赛题1套,复赛2题。比赛时间:\(10:50-12:00a.m\)Part0x01过程-Process\(8:40\,a.m.\)做初赛题目;\(10:40\,a.m.\)拿到题目;\(10:51\,a.m.\)先写\(\text{T2}\),发现是初赛考过的题目,但时限变小;\(11:20\,a.m.\)在\(\text{T2}\)上花了太久,没调出来,......
  • 蒙特卡洛模拟
    MonteCarloSimulationIntroduction蒙特卡洛是西欧小国摩纳哥最著名的一区,以豪华的赌场闻名于世。(赌场,意味着大量重复的随机过程)蒙特卡洛模拟是一种,通过大量随机采样,预测不确定事件可能结果的的数学技术。这个想法的数学保证是大数定律(Lawoflargenumbers):样本数量越多,则其算......
  • 3.1 模拟 参考代码
    P2670[NOIP2015普及组]扫雷游戏#include<cstdio>charmine[105][105];intdx[8]={-1,-1,-1,0,0,1,1,1};intdy[8]={-1,0,1,-1,1,-1,0,1};intmain(){intn,m;scanf("%d%d",&n,&m);for(inti=0;i<n;......
  • GDI+区域(Region)排除与路径(GraphicsPath)叠加透明
    1、区域(Region)排除 1CRectrt;2GetClientRect(&rt);34GraphicsPathpa;5pa.AddEllipse(0,0,rt.Width(),rt.Height());6Regionrg(Rect(0,0,rt.Width(),rt.Height()));7rg.Exclude(&pa);8graphics.FillRegion(&SolidBrush(Color(255,0,......
  • CSP模拟4
    悲,昨天存本地忘发了,今天又不想写模拟5的。考了四道ARC就离谱。A.LIStoOriginalSequence首先考虑\(k=1\),唯一的方案就是倒序输出\(1\)到\(n\)。我们可以想到,这道题的方法是向已经确定的序列\(A\)中插入其他数。对于一个数\(x(x<A_i)\),是不能把它放在\(A_i......
  • uni-app 中模拟器真机运行项目
    1.安装模拟器MuMu 2.配置环境变量找到HbuilderX的安装目录,查找adb.exe文件,复制serve.exe所在文件目录的路径,配置到系统变量的Path中         3.在模拟器中进行配置注意:端口为7555不同模拟器的默认端口是不一样的adb的路径一定是HbuilderX的adb路径,使......
  • 【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算
    ......
  • memcpy/memmove模拟实现
    void*my_memmove(void*dest,constvoid*src,size_tnum){ assert(dest&&src); void*ret=dest; if((char*)dest<(char*)src)//从前向后移 { while(num--) { *(char*)dest=*(char*)src; dest=(char*)dest+1; src=(char*)src+1; } } else......
  • SpringBoot中使用测试框架MockMvc来模拟HTTP请求测试Controller接口
    场景Java中进行单元测试junit.Assert断言、Mockito模拟对象、verify验证模拟结果、Java8中lambda的peek方法使用:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127492361上面讲了开发过程中一些测试方法。如果需要在代码中直接测试某个Controller接口,除了每次启......