zoukankan      html  css  js  c++  java
  • CDOJ 1251 谕神的密码 贪心

    谕神的密码

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://acm.uestc.edu.cn/#/problem/show/1251

    Description

    谕神是集训队里面智商数一数二的大神,在他的电脑里储存着他在学习的东西。每天都要通过学习来提高自己的知识水平。然而,作为一个长者,谕神不愿意将自己的学习资料给那些too young, too simple, sometimes naive的人看,以免被他们看了去搞一个大新闻。于是,谕神给自己的电脑设置了密码。

    当然,他设置的密码也要按照基本法。这个基本法是谕神自己搞出来的。法则是这样的:

    1、密码由2n位数组成,中间由空格隔开,其中,两个数的各个位的和均为s

    2、是满足1条件的最小的数和最大的数

    3、当找不到n位数的和为s的时候,密码就是:-1 -1

    4、谕神保证密码的2个数中没有前导0

    他这个密码只是为了防止too young, too simple, sometimes naive的人进入电脑的,对于你们这些高智商的人群,破译密码应该并不难吧~~

    注意,单独的0,是合法的哦~

    Input

    先读入一个T0T100),为数据组数

    每组数据只有一行,为n(0<n100)和s(0s900).

    Output

    输出谕神的密码

    Sample Input

    1
    2 15

    Sample Output

    69 96

    HINT

    题意

    题解:

    首先我们判断是否能由n个数构成m。

    数据比如 3 0,1 19这种,就不能构成

    然后我们就可以贪心了~

    最小的数,肯定是由1000000000这种,然后从低位开始增加,直到达到s为止

    而最大的数,则是由9999999999这种,从低位到高位,逐渐减小,直到变成s

    比如 4 27这组数据

    首先贪心最小的:

    目前的数 目前的sum
    1000 1
    1009 10
    1099 19
    1899 27

    贪心最大的:
    目前的数 目前的sum
    9999 36
    9990 27

    所以输出1899 9990

    代码:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    int flag;
    int n,m;
    int Min[120];
    int Max[120];
    void getmin()
    {
        int sum = 0;
        for(int i=1;i<=n;i++)
        {
            if(i==1)Min[i]=1;
            else Min[i]=0;
            sum += Min[i];
        }
        sum = m - sum;
        for(int i=n;i>=1;i--)
        {
            int T = min(sum,9-Min[i]);
            sum -= T;
            Min[i] += T;
        }
        if(Min[1]==0)flag = 1;
    }
    void getmax()
    {
        int sum = 0;
        for(int i=1;i<=n;i++)
        {
            Max[i]=9;
            sum+=Max[i];
        }
        sum = sum - m;
        for(int i=n;i>=1;i--)
        {
            int T = min(sum,Max[i]);
            sum-=T;
            Max[i]-=T;
        }
        if(Max[1]==0)flag = 1;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        for(int cas=1;cas<=t;cas++)
        {
            scanf("%d%d",&n,&m);
            flag = 0;
            if(n==1&&m==0)
            {
                printf("0 0
    ");
                continue;
            }
            if(n*9<m)
            {
                printf("-1 -1
    ");
                continue;
            }
            getmin(),getmax();
            if(flag)
            {
                printf("-1 -1
    ");
                continue;
            }
            for(int i=1;i<=n;i++)
                printf("%d",Min[i]);
            printf(" ");
            for(int i=1;i<=n;i++)
                printf("%d",Max[i]);
            printf("
    ");
        }
    }
  • 相关阅读:
    nagios安装配置
    Nagios:企业级系统监控方案
    使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境
    SecureCRT最佳配色方法+直接修改默认配置方法
    highcharts插件使用总结和开发中遇到的问题及解决办法
    关于Highcharts图表组件动态修改属性的方法(API)总结之Series
    Linux中环境变量文件及配置
    使用正则表达式匹配任意字符包括空格和换行符
    设置mysql远程连接root权限
    java读取文件夹下所有文件并替换文件每一行中指定的字符串
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5022017.html
Copyright © 2011-2022 走看看