当前位置:网站首页>火星人 --简单的数学题
火星人 --简单的数学题
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;
}
原理是一样的
边栏推荐
猜你喜欢
随机推荐
RestFul,会话技术,Fiddler
3D软件开发工具HOOPS全套产品开发介绍 | HOOPS Visualize、HOOPS Publish
BIM技术多牛逼?BIM技术在建筑工程行业的四大发展趋势
.net(一)WebService创建
Laravel文档阅读笔记-Rendering JSON(对JS变量进行赋值)
(三)、时间序列预测
原生JDBC操作数据库
转换为onnx模型错误汇总
DIMP:Learning Discriminative Model Prediction for Tracking 学习判别模型预测的跟踪
C语言:字符逆序
记录一次客户的APP数据库版本号升级失败的情况
链表专项练习(四)
PyTorch中 torch.nn与torch.nn.functional的区别
CUDA和cuDNN 安装10.0版本
C#高级学习1
Decimal工具类
js数组相关知识复习
如何把无用的代码注释为 Deprecated 弃用
接口测试概念
图像处理(一)图像基础