• 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("
    ");
        }
    }
  • 相关阅读:
    loadView和viewDidLoad的官方API的一些解释
    面向对象IOS编程中的聚合与耦合
    史上最全的iOS面试题及答案
    oc的基本数据的转换
    NSDateFormatter时间函数
    图片点击放大,再次点击返回原视图.完美封装,一个类一句代码即可调用.IOS完美实现
    同一ViewController内如果有两处AlertView要用代理Delegate怎么写法
    简单实现---下拉刷新 --使用UITableViewController中的refreshControl属性
    简单实现---上拉加载刷新---
    洛谷2863 [Usaco06JAN]牛的舞会
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5022017.html
Copyright © 2020-2023  润新知