0和5(中南林业科技大学第十一届程序设计大赛G题)

小C有一堆包含0和5的数字卡片,他需要抽出一些卡片,排列成一个数,使其尽可能大并能被90整除。若不能构成,输出-1;否则,将所有5放在前面,0放在后面,确保5的数量为9的倍数。
摘要由CSDN通过智能技术生成

链接:https://ac.nowcoder.com/acm/contest/910/G
来源:牛客网
 

题目描述

 

小C手中有n张牌,每张牌上有一个一位数的数,这个数字不是0就是5。

小C从这些牌在抽出任意张(不能抽0张),排成一行就组成了一个数。

使得这个数尽可能大,而且可以被90整除。

 

注意:

1.这个数没有前导0,

2.小C不需要使用所有的牌。

 

 

输入描述:

每个测试数据输入共2行。

第一行给出一个n,表示n张牌。(1<=n<=1000)

第二行给出n个整数a[0],a[1],a[2],…,a[n-1] (a[i]是0或5 ) 表示牌上的数字。

输出描述:

共一行,表示由所给牌组成的可以被90整除的最大的数,如果没有答案则输出”-1”(没有引号)

示例1

输入

4
5 0 5 0
输出

0

先打一个表,看看满足条件的有哪些:

#include <iostream>
#include <cstring>
using namespace std;
const long long mod = 1e12 + 7;
typedef long long ll;
int main()
{
    if(5555555555555555550%90==0)
        cout<<"Yes"<<endl;
    for(ll i=90;i<=mod;i+=90)
    {
        ll n=i,flag=0;
        while(n)
        {
            ll p=n%10;
            n/=10;
            if(p==0||p==5)
                continue;
            else
            {
                flag=1;
                break;
            }
        }
        //cout<<i<<endl;
        if(flag==0)
          cout<<i<<endl;
    }
    return 0;
}

打完表会发现满足条件的都有一个共同点,有9的倍数个5并且必须至少有一个0时,将所有9的倍数个5放在最前面,0放在最后面,因为没有必要用所有的牌,所以看最大9的倍数是多少,超过的可以不用就能满足条件了。另外,当只出现5时,不能组成,输出-1,只要有0就可以输出0。

AC代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <ostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
typedef long long ll;
map<ll,ll> ma;
int main()
{
    ll n,i,j,ans=0,flag=0,sum=0,f=0,a;
    cin>>n;
    for(i=0;i<n;i++){
        cin>>a;
        if(a==5){
            ans++;
            f=1;
        }
        else{
            flag=1;
            sum++;
        }
    }
    if(f==1&&ans>=9&&flag==1){
        ll k=ans/9;
       while(k--)
       {
        for(i=0;i<9;i++)
            cout<<"5";

       }
        for(i=0;i<sum;i++)
            cout<<"0";
        cout<<endl;
    }
    else
    if(flag==0)
       cout<<"-1"<<endl;
    else
        cout<<"0"<<endl;
    return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值