CF 214B Hometask(想法题)
题目链接: 传送门
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(想法题)的更多相关文章
- HDU 4972 Bisharp and Charizard 想法题
Bisharp and Charizard Time Limit: 1 Sec Memory Limit: 256 MB Description Dragon is watching NBA. He ...
- CodeForces 111B - Petya and Divisors 统计..想法题
找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...
- HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...
- CF 701B Cells Not Under Attack(想法题)
题目链接: 传送门 Cells Not Under Attack time limit per test:2 second memory limit per test:256 megabyte ...
- CF 405C Unusual Product(想法题)
题目链接: 传送门 Domino Effect time limit per test:1 second memory limit per test:256 megabytes Descrip ...
- CF 405B Domino Effect(想法题)
题目链接: 传送门 Domino Effect time limit per test:1 second memory limit per test:256 megabytes Descrip ...
- HDU - 5969 最大的位或 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5969 (合肥)区域赛签到题...orz 题意:给你l,r,求x|y的max,x,y满足l<=x<=y ...
- 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 ...
- cf Canada cup A题
A. Jumping Ball time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
随机推荐
- C# 7.0 新特性1: 基于Tuple的“多”返回值方法
本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...
- Adobe Reader & PDF 护眼设置
1.首先选择“编辑”--->“首选项” 选择其他颜色,把RGB如下设置
- android开发------响应用户事件
今天的内容有点简单,不难,就是为按钮添加onClick事件. 新知识点: Intent类的简单使用 startActivity方法 一般事件都由按钮触发,现在我们要实现的是当用户点击按钮的时候,启动 ...
- 检查URL地址脚本
方法一: [root@Centos-6 script]# vi check_url_01.sh #!/bin/sh #this script is created by nulige #check u ...
- Android应用崩溃后异常捕获并重启并写入日志
在Android开发时,有时会因为一些异常导致应用报错,偶尔会因为错误 而崩溃,导致用户体验下降,为了解决这问题,我们就要对这样的异常处理: 代码如下: CrashHandler.java impor ...
- ActiveMQ_Topic队列(三)
一.本文章包含的内容 1.列举了ActiveMQ中通过Topic方式发送.消费队列的代码(监听者有两个,分别是topicMessageListener1.topicMessageListener2) ...
- Notes on 'Efficient Graph-Based Image Segmentation'
Notes on Efficient Graph-Based Image Segmentation 算法的目标 按照一种确定的标准, 将图片分割成细粒度的语义区域, 即Super pixel. 算法步 ...
- bzoj1503
treap改了好长时间,erase写错了... #include<iostream> #include<cstdio> #include<cstdlib> usin ...
- git初体验(五)SSH的理解
一.SSH SSH是Secure shell的缩写,即"安全外壳协议",专为远程登录会话和其他网络服务提供安全性的协议,是一项计算机上的安全协议. 传统的网络服务程序,如rsh.F ...
- 给<tr>标签添加边框
今天做网站时发现给<tr>添加border无效.起初还以为tr不支持这个属性,百度,原来只要给<table>添加一句代码就可以了,代码如下: table{border-coll ...