题目链接: 传送门

Hometask

Time Limit: 2 seconds     Memory Limit: 256 megabytes

Description

Furik loves math lessons very much, so he doesn't attend them, unlike Rubik. But now Furik wants to get a good mark for math. For that Ms. Ivanova, his math teacher, gave him a new task. Furik solved the task immediately. Can you?
You are given a set of digits, your task is to find the maximum integer that you can make from these digits. The made number must be divisible by 2, 3, 5 without a residue. It is permitted to use not all digits from the set, it is forbidden to use leading zeroes.
Each digit is allowed to occur in the number the same number of times it occurs in the set.

Input

A single line contains a single integer n (1 ≤ n ≤ 100000) — the number of digits in the set. The second line contains n digits, the digits are separated by a single space.

Output

On a single line print the answer to the problem. If such number does not exist, then you should print -1.

Sample Input

1
0

11
3 4 5 4 5 3 5 3 4 4 0

8
3 2 5 1 5 2 2 3

Sample Output

0

5554443330

-1

思路:

题目大意:给一个都是数字的集合,组成一个尽量大的数使之能被2,3,5整除。
找出集合中是否有9,没有则停止判断。对于给出的数字集合,看总和是否能被3整除,能直接从大到小输出,不行的话,对3取模,对取模结果(1或2)单独判断,删除集合中某些数字是否能被3整除,不行则停止。输出是忽略前导0。(训练赛时在对模结果为1的特判中折腾了好久。模结果为1,则可以删去集合中一个对3取模也为1的数,或是删去两个对3取模为2的数,模结果为2同理。 官方题解

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef __int64 LL;
struct Node
{
    LL cnt,val;
    bool flag;
    Node():cnt(0),val(0),flag(false) {}
};
bool cmp(Node x,Node y)
{
    return x.val > y.val;
}

int main()
{
    LL N,tmp,maxx = 0,sum = 0;
    bool Isz = false;
    Node num[15];
    scanf("%I64d",&N);
    for (int i = 0; i < N; i++)
    {
        scanf("%I64d",&tmp);
        sum += tmp;
        num[tmp].val = tmp;
        num[tmp].cnt++;
        num[tmp].flag = true;
        if (tmp > maxx)
        {
            maxx = tmp;
        }
        if (tmp == 0)
        {
            Isz = true;
        }
    }
    if (!Isz)
    {
        printf("-1\n");
    }
    else
    {
        if (sum % 3 == 0)
        {
            if (num[maxx].val == 0)
            {
                printf("0\n");
            }
            else
            {
                for (int i = maxx; i >= 0; i--)
                {
                    if(num[i].flag)
                    {
                        while (num[i].cnt--)
                        {
                            printf("%I64d",num[i].val);
                        }
                    }
                }
                printf("\n");
            }
        }
        else
        {
            LL r = sum % 3;
            bool Can = false;
            LL cnt = 0;
            if (r == 1)
            {
                for (int i = 1; i <= maxx ; i+=3)
                {
                    if (num[i].flag && num[i].cnt)
                    {
                        Can = true;
                        num[i].cnt--;
                        if (num[i].cnt == 0)
                        {
                            num[i].flag = false;
                            num[i].val = 0;
                        }
                        break;
                    }
                }
                if(!Can)
                {
                    for (int i = 2;i <= maxx;i+=3)
                    {
                        if (num[i].flag && num[i].cnt)
                        {
                            while (num[i].cnt--)
                            {
                                cnt++;
                                if (num[i].cnt == 0)
                                {
                                    num[i].flag = false;
                                }
                                if (cnt == 2 || num[i].cnt == 0)
                                {
                                    if (cnt == 2)
                                    {
                                        Can = true;
                                    }
                                    break;
                                }
                            }
                            if (cnt == 2)
                            {
                                Can = true;
                                break;
                            }
                        }
                    }
                }
            }
            else if (r == 2)
            {
                for (int i = 2; i <= maxx; i+=3)
                {
                    if (num[i].flag && num[i].cnt)
                    {
                        Can = true;
                        num[i].cnt--;
                        if(num[i].cnt == 0)
                        {
                            num[i].flag = false;
                            num[i].val = 0;
                        }
                        break;
                    }
                }
                if (!Can)
                {
                    for (int i = 1; i <= maxx; i+=3)
                    {
                        if (num[i].flag && num[i].cnt)
                        {
                            while (num[i].cnt--)
                            {
                                cnt++;
                                if (num[i].cnt == 0)
                                {
                                    num[i].flag = false;
                                }
                                if (cnt == 2 || num[i].cnt == 0)
                                {
                                    if (cnt == 2)
                                    {
                                        Can = true;
                                    }
                                    break;
                                }
                            }
                        }
                        if (cnt == 2)
                        {
                            Can = true;
                            break;
                        }
                    }
                }
            }
            if (!Can)
            {
                printf("-1\n");
            }
            else
            {
                bool Noz = false;
                for (int i = 0;i <= maxx;i++)
                {
                    if (num[i].flag && num[i].val)
                    {
                        Noz = true;
                        break;
                    }
                }

                if (Noz)
                {
                    for (int i = maxx;i >= 0;i--)
                    {
                        if (num[i].flag && num[i].cnt)
                        {
                            while (num[i].cnt--)
                            {
                                printf("%I64d",num[i].val);
                            }
                        }
                    }
                    printf("\n");
                }
                else
                {
                    printf("0\n");
                }
            }
        }
    }
    return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int N;
    while (~scanf("%d",&N))
    {
        int ans[10] = {0};
        int tmp,sum = 0;
        bool flag = false;
        for (int i = 0;i < N;i++)
        {
            scanf("%d",&tmp);
            ans[tmp]++;
            sum += tmp;
        }
        if (ans[0] == 0)
        {
            printf("-1\n");
        }
        else
        {
            flag = true;
            if (sum % 3 == 1)
            {
                if (ans[1] + ans[4] + ans[7])
                {
                    for (int i = 1;i <= 7;i += 3)
                    {
                        if (ans[i])
                        {
                            ans[i]--;
                            break;
                        }
                    }
                }
                else if (ans[2] + ans[5] + ans[8] >= 2)
                {
                    for (int i = 2,j = 1;i <= 8;i+=3)
                    {
                        while (ans[i] && j <= 2)
                        {
                            ans[i]--;
                            j++;
                        }
                    }
                }
            }
            else if (sum % 3 == 2)
            {
                if (ans[2] + ans[5] + ans[8])
                {
                    for (int i = 2;i <= 8;i += 3)
                    {
                        if (ans[i])
                        {
                            ans[i]--;
                            break;
                        }
                    }
                }
                else if (ans[1] + ans[4] + ans[7] >= 2)
                {
                    for (int i = 1,j = 1;i <= 7;i += 3)
                    {
                        while (ans[i] && j <= 2)
                        {
                            ans[i]--;
                            j++;
                        }
                    }
                }
            }
        }

        if (flag)
        {
            if (ans[1] + ans[2] + ans[3] + ans[4] + ans[5] + ans[6] + ans[7] + ans[8] + ans[9])
            {
                for (int i = 9;i >= 0;i--)
                {
                    while (ans[i]--)
                    {
                        printf("%d",i);
                    }
                }
            }
            else
            {
                printf("0");
            }
            printf("\n");
        }
    }
    return 0;
}

后来参考了别人代码= =果然自己太native,运用一点数学思想可以省略很多特判= =还是要注重多思考啊。

CF 214B Hometask(想法题)的更多相关文章

  1. HDU 4972 Bisharp and Charizard 想法题

    Bisharp and Charizard Time Limit: 1 Sec  Memory Limit: 256 MB Description Dragon is watching NBA. He ...

  2. CodeForces 111B - Petya and Divisors 统计..想法题

    找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...

  3. HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...

  4. CF 701B Cells Not Under Attack(想法题)

    题目链接: 传送门 Cells Not Under Attack time limit per test:2 second     memory limit per test:256 megabyte ...

  5. CF 405C Unusual Product(想法题)

    题目链接: 传送门 Domino Effect time limit per test:1 second     memory limit per test:256 megabytes Descrip ...

  6. CF 405B Domino Effect(想法题)

    题目链接: 传送门 Domino Effect time limit per test:1 second     memory limit per test:256 megabytes Descrip ...

  7. HDU - 5969 最大的位或 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5969 (合肥)区域赛签到题...orz 题意:给你l,r,求x|y的max,x,y满足l<=x<=y ...

  8. Codeforces Round #354 (Div. 2)-C. Vasya and String,区间dp问题,好几次cf都有这种题,看来的好好学学;

    C. Vasya and String time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. cf Canada cup A题

    A. Jumping Ball time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

随机推荐

  1. 如何使用 UC浏览器开发者版 进行移动端调试

    在 如何用 fiddler 代理调试本地手机页 一文中我们了解了如何用手机查看 PC 端写的网页(本地),但是我们只能看到页面效果,如果哪段 js 挂了,那部分样式失效了,我们该如何进行调试呢?今天为 ...

  2. 【前端也要学点算法】 归并排序的JavaScript实现

    前文我们了解了快速排序算法的实现,本文我们来了解下另一种流行的排序算法-归并排序算法. 我们先来回顾下快排.快排的核心是找出一个基准元素,把数组中比该元素小的放到左边数组,比该元素大的放到右边数组,如 ...

  3. js队列

    用指针和数组模拟基本队列 http://blog.csdn.net/zhuwq585/article/details/53177192 js下的事件队列,或者异步队列 http://www.jb51. ...

  4. 揭秘Facebook首个数据中心:全球15亿用户的账户信息都在这里

      投递人 itwriter 发布于 2016-07-14 17:41 评论(0) 原文链接 [收藏]  对于 Facebook.Google 这种体量的科技公司而言,数据中心应该是处于军事级别的保密 ...

  5. JAVA内嵌数据库H2的使用入门

    H2数据库是开源的,非常适合做嵌入式数据库使用,尤其用java编码的时候. H2的优势: 1.h2采用纯Java编写,因此不受平台的限制. 2.h2只有一个jar文件,十分适合作为嵌入式数据库试用. ...

  6. SqlServer中——查找杀死阻塞进程

    查找阻塞进程: SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM ...

  7. Python基础-列表_元组_字典_集合

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  8. Visual Studio 2013启用AnkSVN

    1. 官网下载AnkSVN  https://ankhsvn.open.collab.net/ 2. 安装 3. 启用 When you enable AnkhSVN as a VS.NET sour ...

  9. SVN常见图标的含义

    项目视图   The Package Explorer view - 已忽略版本控制的文件.可以通过Window → Preferences → Team → Ignored Resources.来忽 ...

  10. mysql 安装失败解决方法

    在安装mysql的过程中,出现的最麻烦的问题和解决方法 安装后,启动不成功,就卡了,程序就没有响应. 如何解决: 找到mysql安装目录下的 #Path to the database root da ...