洛谷.P2192 HXY玩卡片

探讨了如何从标有数字0或5的卡片中选择并排列,形成最大且能被90整除的数。分析了算法思路,包括考虑数字和是否为9的倍数及确保数字最大化的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
HXY得到了一些卡片,这些卡片上标有数字0或5。现在她可以选择其中一些卡片排成一列,使得排出的一列数字组成的数最大,且满足被90整除这个条件。同时这个数不能含有前导0,即0不能作为这串数的首位。如果不能排出这样的数,输出“-1”。

输入格式
第一行,卡片的个数n。
第二行,分别给出了这n个数(只能为数字5或0)。

输出格式
仅一行,如果可以排出,则输出这个数。否则输出“-1”。

{
说明/提示
数据范围:
对于30%的数据,n<=10;
对于20%的数据,仅含数字5;
对于100%的数据,n<=1000。
}

分析:
1.卡片上只有0或者5两个数
2.HXY可以选择一些卡片
3.数字最大且能被90整除
4. 根据样例1,0可以单独输出
重点分析第三点,综合第一点:组成的数字各个位数的和能被9整除,并且最后一位必须是0(否则不能被90整除),用five表示5的个数,zero表示0的个数,我们发现:组成的数字各个位数的和为5×five,为了保证其能被9整除,所以还要考虑这个数是否是9的倍数,而判断一个数是不是9的倍数的方法是看数字和是不是9的倍数,所以要看5的个数这里一直没想明白,一直想的是把五不停地往后挪,菜唧唧。因此可以做一下讨论:
zero == 0 时,必须输出-1。不能被90整除
zero != 0 && five < 9 时,必须输出0。
zero != 0 && five >= 9 时,输出的5的个数为a,a为最大的满足 a <= five,且a为9的整数倍。
最后,为了保证数字最大,则要让5尽量排在前面,且0必须出现在最后一位

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<queue>
#define PI 3.1415926535
#include<functional>
#include<vector>
#include <iostream>

using namespace std;
typedef long long ll;
const int maxn=3e4+10;
const ll _INF = -8e18;
const int N = 1e5 + 10;

bool cmp(ll a,ll b)
{
    return a>b;
}//从大到小

int main()
{
    int n,i,se,a=0,b=0,k;
    cin>>n;
    for(i=1; i<=n; i++)
    {
        cin>>se;
        if(se==5)
            a++;
        else
            b++;
    }
    if(b==0)
        printf("-1");
    else
    {
        if(a<9)
            printf("0");
        else
        {
            for(i=1;i<=a/9*9;i++)//一直觉得这里很省时间,感谢dalao
                cout<<5;
            for(i=1;i<=b;i++)
               cout<<0;
        }
    }
    return 0;
}

其实不是很难的一道题,但我就是没做对。。。
哭唧唧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值