当前位置:网站首页>火星人 --简单的数学题

火星人 --简单的数学题

2022-08-09 07:57:00 scwMason

 

题目简单来说就是五根手指代表1 2 3 4 5,然后按照从小到大全排列,然后根据给出的第二个数据计算出整个全排列中第几大的数

那么我们首先要解决的是:从小到大全排列的顺序问题,这里我们可以用两种方法:

1.手写代码

2.STL函数

 

手写代码主要掌握下面的逻辑

1.首先从最尾端开始往前寻找两个相邻元素,令第一元素为*i,第二元素为*ii,且满足*i<*ii。

2.找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个大于*i的元素,令为*j,将i,j元素对调(swap)。

3.再将ii之后的所有元素颠倒(reverse)排序。

然后就可以写出代码:
 

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int arr[10005],n,m;
void work()
{
	int flag;
	//寻找第一组arr[i]<arr[i+1]的组合 
	for(int i=n-2;i>=0;i--)
	{
		if(arr[i]<arr[i+1])
		{
			flag=i;
			break;
		}
	}
	//从后往前寻找到第一个大于arr[flag]的数,与arr[flag]交换 
	for(int i=n-1;i>=0;i--)
	{
		if(arr[i]>arr[flag])
		{
			int cur=arr[flag];
			arr[flag]=arr[i];
			arr[i]=cur;
			break;
		}
	}
	
	//将flag后面的所有数都反转 
	int left=flag+1,right=n-1;
	while(left<=right)
	{
		int ds=arr[left];
		arr[left]=arr[right];
		arr[right]=ds;
		left++;
		right--;
	}
	
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	while(m--)
	{
		//next_permutation(arr,arr+n);
		work(); 
	}
	for(int i=0;i<n-1;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("%d",arr[n-1]);
	return 0;
} 

 

如果是用STL函数的话,就可以:
 

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int arr[10005],n,m;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	while(m--)
	{
		next_permutation(arr,arr+n); 
	}
	for(int i=0;i<n-1;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("%d",arr[n-1]);
	return 0;
} 

原理是一样的

原网站

版权声明
本文为[scwMason]所创,转载请带上原文链接,感谢
https://blog.csdn.net/scwMason/article/details/97775374