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++ 指针(二)
函数指针 可以使用算法的地址传递给方法,传递之前要先完成以下工作 1.获取函数的地址 2.声明一个函数指针 3.使用函数指针来调用函数 1.获取函数的地址,只要使用函数名就可以 Fun2(Fun1); ...
- PHP中WEB典型应用技术
主要讲5个方面: PHP与web页面的交互:表单传值,文件的上传与下载 http协议 PHP的会话技术:cookie和session PHP的图像技术:GD库,图像的常见的制作和操作,验证码,二维码, ...
- JQuery 图片略缩与弹出预览 jqthumb fancybox
弹出框插件-FANCYBOXhttp://www.jq22.com/jquery-info28 jqthumb.js缩略图插件 http://www.ijquery.cn/?p=798
- 一起写一个JSON解析器
[本篇博文会介绍JSON解析的原理与实现,并一步一步写出来一个简单但实用的JSON解析器,项目地址:SimpleJSON.希望通过这篇博文,能让我们以后与JSON打交道时更加得心应手.由于个人水平有限 ...
- 订餐系统之定时器Timer不定时
经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统日志中会有警告,如果您有更好的方案 ...
- linux 内存清理/释放命令
1.清理前内存使用情况 free -m 2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: ...
- Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询
内连接查询 内连接与SqL中inner join一样,即找出两个序列的交集 Model1Container model = new Model1Container(); //内连接 var query ...
- Matlab中数组元素引用——三种方法
Matlab中数组元素引用——三种方法 1.Matlab中数组元素引用有三种方法 1 2 3 1.下标法(subscripts) 2.索引法(index) 3.布尔法(Boolean) 注意:在使 ...
- LXC的介绍
LXC又名Linux container,是一种虚拟化的解决方案,这种是内核级的虚拟化.(主流的解决方案Xen ,KVM, LXC) 介绍 通过namespace进行资源的隔离,Gust1下的进程与G ...
- android开发------编写用户界面之线性布局(补充知识)
在前面的文章中 http://www.cnblogs.com/ai-developers/p/android_linearlayout.html 我们看到了布局中有这样一个属性: layout_wei ...