zoukankan      html  css  js  c++  java
  • Codeforces 515C 题解(贪心+数论)(思维题)

    题面

    传送门:http://codeforces.com/problemset/problem/515/C

    Drazil is playing a math game with Varda.

    Let’s define f(x)f(x)for positive integer x as a product of factorials of its digits. For example, f(135)=1!3!5!f(135)=1!∗3!∗5!

    First, they choose a decimal number a consisting of n digits that contains at least one digit larger than 1. This number may possibly start with leading zeroes. Then they should find maximum positive number x satisfying following two conditions:

    1. x doesn’t contain neither digit 0 nor digit 1.

    2. f(x)=f(a)f(x)=f(a)

    Help friends find such number.

    题目大意:
    定义f(x)为x的每一位的阶乘之积
    给出一个数a,求满足条件(x的每一位没有0或1)的最大x,使f(x)=f(a)

    分析:

    此题可用贪心求解
    贪心的思路是很显然的,应该让x的位数尽量多,而每一位尽量小,最大的数应该排在最左边
    这样,我们就可以把a的每一位拆开
    如a=6
    6!=6*5*4*3*2*1=6*5!=3!*5!
    所以6可以被替换成35

    所以我们把0~9的数字拆开(其实0,1应该直接舍去,因为不符合条件)
    0!=0!
    1!=1!
    2!=2!
    3!=3!
    4!=3!*4=3!*2!*2!
    5!=5!
    6!=5!*6=5!*3!
    7!=7!
    8!=7!*8=7!*2!*2!*2!
    9!=9*8*7!=7!*3!*3!*2!;

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const string convert[10]={"0","0","2","3","322","5","53","7","7222","7332"};
    string s;
    string ans;
    int n;
    int cmp(char x,char y){
        return x>y;
    }
    int main(){
        scanf("%d",&n);
        cin>>s;
        ans="";
        for(int i=0;i<n;i++){
            if(s[i]-'0'==0||s[i]-'0'==1) continue;
            ans=ans+convert[s[i]-'0'];
        }
    //  cout<<ans<<endl;
        sort(ans.begin(),ans.end(),cmp);
        cout<<ans<<endl;
    } 
  • 相关阅读:
    Linux文件系统
    Ant整合svnant(三)
    Linux文件系统基本结构和基本操作管理
    Ant生成javadoc(四)
    Linux系统常用命令
    Linux系统目录架构
    使用fdisk进行磁盘管理
    命令行BASH的基本操作
    python 获取项目的根路径
    游戏自动化测试思路
  • 原文地址:https://www.cnblogs.com/birchtree/p/9858043.html
Copyright © 2011-2022 走看看