题目描述
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;
}
其实不是很难的一道题,但我就是没做对。。。
哭唧唧