当前位置:网站首页>火星人 --简单的数学题
火星人 --简单的数学题
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;
}
原理是一样的
边栏推荐
猜你喜欢
随机推荐
线程API
Apache POI
收藏!Solidworks从设计到制造流程解决方案 2022来了!
世界顶尖3D Web端渲染引擎:HOOPS Communicator技术介绍(一)
pip安装更换镜像
CUDA和cuDNN 安装10.0版本
H3C_利用策略路由实现出口双线路负载(选路)的部署
转换为onnx模型错误汇总
Native JDBC operation database
CoCube传感器MPU6050笔记
BGP路由协议的那些事?(中)
[STL]stack与queue
DIMP:Learning Discriminative Model Prediction for Tracking 学习判别模型预测的跟踪
c语言位段
C语言笔记 学习预处理 学习宏定义
IP地址及子网划分
【机器学习】降维代码练习
Record a failure to upgrade the client's APP database version number
工信部等四部门推动绿色智能家居产品下乡
P1505 [National Training Team] Tourism Tree Chain Breakdown
![[STL]list](/img/d1/f3c2d52502b2ca4eeaba1c7289562c.png)








