CodeForce 124B Permutations(水题)

一直在尝试用英文写题解,但是我发现我的英语水平还达不到能把问题说清楚的水平,所以还是改回中文吧……
这是一道比较水的题,但是同样需要注意下。
这道题的题意是给一组一个N位数的多个不同的排列所构成的数,然后让我们每次对所有的数进行数位交换,找出所有交换中最大值和最小值的差最小的一次,并且将这个差输出。
提议很简短,我们首先想到如何对所有的数进行排列,其实根本不用,我们可以先生成一个次序数组,然后对这个数组进行全排列,之后重新生成数字就行了。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[101][101];
int n,k;
int pos[101];
int main()
{
    cin>>n>>k;
    for(int i = 1;i<=n;i++)
    {
        for(int j = 1;j<=k;j++)
        {
            char c;
            cin>>c;
            a[i][j] = c - '0';
        }
    }
    for(int i  = 1;i<=k;i++)
    {
        pos[i] = i;
    }
    int ans = 2009000999;
    do
    {
        int mn = 2009000999,mx = -2009000999;
        for(int i  =1;i<=n;i++)
        {
            int temp = 0;
            for(int j =1;j<=k;j++)
            {

                temp =temp *10 + a[i][pos[j]];
            }
            //cout<<temp<<endl;
            mx = max(mx,temp);
            mn = min(mn,temp);
        }
        ans = min(ans,mx - mn);
    }while(next_permutation(pos+1,pos+1+k));
    cout<<ans<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值