洛谷[P2192]HXY玩卡片

题目传送门OvO


题目描述

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

输入输出格式

输入格式:

第一行,卡片的个数n。

第二行,分别给出了这n个数(只能为数字5或0)。

输出格式:

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


比较坑人但数据较水的一道题

分析

在看题时,要注意以下几点:

卡片上只有0或者5两个数
HXY可以选择一些卡片
数字最大且能被90整除
根据样例1,0可以单独输出(这一点很坑人,因为题目中明确说了0不能作为这串数的首位)

重点分析第三点,综合第一点,我们发现:组成的数字各个位数的和能被9整除,并且最后一位必须是0(否则不能被90整除)。

我们用five表示5的个数,zero表示0的个数,我们发现:组成的数字各个位数的和为5×five,为了保证其能被9整除,必须要保证数字中5的个数为9的倍数。

因此可以做一下讨论:

zero == 0  时,必须输出-1。因为这样的数一定不能被10整出,进而不能被90整除

zero != 0 and five < 9 时,必须输出0。

zero != 0 and five >= 9 时,输出的5的个数为a,a为最大的满足 a <= five,且a为9的整数倍。

最后,为了保证数字最大,很容易得到要让5尽量排在前面。又由于0必须出现在最后一位,没有出现冲突,所以我们很高兴,只需要让所有的5排在所有的0前面即可。

#include <stdio.h>
int N;
int main()
{
    int i;
    int temp;
    int five = 0;
    int zero = 0;
    scanf("%d", &N);
    for(i = 0; i < N; i++)
    {
        scanf("%d", &temp);
        if(temp == 5)
        {
            five++;
        }
        else if(temp == 0)
        {
            zero++;
        }
    }
    //以下判断的分类逻辑不是很清晰,建议先看“分析”部分
    if(five < 9 && zero != 0)
    {
        printf("0");
        return 0;
    }
    if((five < 9 && zero == 0) || zero == 0)
    {
        printf("-1");
    }
    if(five % 9 == 0)
    {
        for(i = 1; i <= five; i++)
        {
            printf("5");
        }
        for(i = 1; i <= zero; i++)
        {
            printf("0");
        }
        return 0;
    }
    else
    {
        //这步实现“分析”中的“输出的5的个数为a,a为最大的满足 a <= five,且a为9的整数倍的数”
        for(temp = five; temp % 9 != 0; temp--);
        for(i = 1; i <= temp; i++)
        {
            printf("5");
        }
        for(i = 1; i <= zero; i++)
        {
            printf("0"); 
        }
        return 0;
    }
}

pascal也来了:

var n,a,b,c,i:longint;
begin
  readln(n);
  for i:=1 to n do
  begin
    read(a);
    if a=5 then inc(b) else inc(c);//统计0和5的个数
  end;
  if (b>=9) and (c>=1) then //因为只有5555555550能整除90 所以5的个数要大于9和0的个数要大于1;
  begin
    for i:=1 to b div 9 do write(555555555);//节省时间
    for i:=1 to c do write(0);//越多0数就越大
  end else
  if c>=1 then write(0) else write(-1);
end.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值