zoukankan      html  css  js  c++  java
  • HDU 6351.Beautiful Now-暴力、全排列、思维 (2018 Multi-University Training Contest 5 1002)

    2018 Multi-University Training Contest 5

    6351.Beautiful Now

    题意就是交换任意两个数字,问你交换k次之后的最小值和最大值。

    官方题解:

    哇塞,C++竟然自带全排列的函数,头文件为#include<algorithm>

    全排列 next_permutation() 函数。随便传送两篇博客: 

    1.[算法]——全排列(Permutation)以及next_permutation

    代码:

     1 //1002-6351-暴力、全排列、思维
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<bitset>
     7 #include<cassert>
     8 #include<cctype>
     9 #include<cmath>
    10 #include<cstdlib>
    11 #include<ctime>
    12 #include<deque>
    13 #include<iomanip>
    14 #include<list>
    15 #include<map>
    16 #include<queue>
    17 #include<set>
    18 #include<stack>
    19 #include<vector>
    20 using namespace std;
    21 typedef long long ll;
    22 
    23 const double PI=acos(-1.0);
    24 const double eps=1e-6;
    25 const ll mod=1e9+7;
    26 const int inf=0x3f3f3f3f;
    27 const int maxn=1e5+10;
    28 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    29 
    30 int a[15],b[15],vis[15],n;//b用来存下标,vis用来标记
    31 int k;//输入的交换次数
    32 
    33 int solve()
    34 {
    35     memset(vis,0,sizeof(vis));
    36     int num=0;
    37     for(int i=0;i<n;i++){
    38         if(vis[i]==0){
    39             int t=0;
    40             while(vis[i]==0){
    41                 vis[i]=1;
    42                 t++;//t代表跟第i个数交换有关的数一共有几个
    43                 i=b[i];//将下标指向跟它进行交换的数的下标,即判断跟它交换的数是否还与其他的数进行了交换
    44             }
    45             num+=t-1;//用来记录交换次数
    46         }
    47         if(num>k) return 0;
    48     }
    49     return num;//返回交换次数
    50 }
    51 
    52 char s[20];
    53 
    54 int main()
    55 {
    56     int t;
    57     scanf("%d",&t);
    58     while(t--){
    59         scanf("%s%d",s,&k);//用字符串来存输入的数
    60         n=strlen(s);
    61         ll ret=0,maxx,minn;
    62         for(int i=0;i<n;i++){
    63             a[i]=s[i]-'0';
    64             b[i]=i;
    65             ret=ret*10+a[i];
    66         }
    67         maxx=minn=ret;
    68         while(next_permutation(b,b+n)){//注意是下标全排列
    69             if(a[b[0]]!=0&&solve()!=0){//全排列所组合的这个数不能是前导0并且要找交换k次的情况
    70                 ll sum=0;
    71                 for(int i=0;i<n;i++)
    72                     sum=sum*10+a[b[i]];
    73                 maxx=max(maxx,sum);
    74                 minn=min(minn,sum);
    75             }
    76         }
    77         printf("%lld %lld
    ",minn,maxx);
    78     }
    79 }

    溜了。。。

  • 相关阅读:
    C# 生成随机索引列表
    QQ音乐MP3下载
    微信Dat文件解码
    C#工作常用关键字
    C#左移运算符
    C#中datatable操作
    html 显示 pdf
    framework7 下拉刷新、无限滚动
    framework7 总结之前遇到的问题和踩过的坑
    HTML 引用大全
  • 原文地址:https://www.cnblogs.com/ZERO-/p/9474681.html
Copyright © 2011-2022 走看看