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 ...
随机推荐
- 分布式中使用Redis实现Session共享(一)
上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享".这篇文章将会介绍如何使用Redis,下一篇 ...
- c++基础 explicit
c++的构造函数也定义了一个隐式转换 explicit只对构造函数起作用,用来抑制隐式转换 看一个小例子 新建一个头文件 #ifndef CMYSTRING_H #define CMYSTRING_H ...
- 基于canvas实现物理运动效果与动画效果(一)
一.为什么要写这篇文章 某年某月某时某种原因,我在慕课网上看到了一个大神实现了关于小球的抛物线运动的代码,心中很是欣喜,故而写这篇文章来向这位大神致敬,同时也为了弥补自己在运动效果和动画效果制作方面的 ...
- C#版的MapReduce
如果不知道MapReduce是怎么工作的,请看这里,如果不知道MapReduce是什么,请google之! 今天“闲”来无事,忽想起C#里没有MapReduce的方法,构思之,coding之: #re ...
- js的数组
转载:http://blog.163.com/sammer_rui/blog/static/846200442010717900634/ https://developer.mozilla.org/z ...
- 异步dcfifo的读写
异步dcfifo的原理 Dcfifo即是Double clk fifo,意思是双时钟的fifo.或许你现在还不知道什么是fifo,那我就先从fifo(就是同步fifo,不过同步fifo在实际运用中比较 ...
- 如何给我们的eclipse新建文件自动生成注释
有时候,我们需要给我们的文件加载注释,但手动给每一个方法,每一个类添加注释,非常的繁琐,幸好强大的eclipse已经为我们准备好了自动添加注释的配置文件,它就是——codetemplates.xml ...
- Beta版本冲刺Day3
会议讨论: 628:已经将原本写在jsp中的所有界面修饰代码转移到了css文件中,同时当页面跳转的时候也不会出现崩溃的现象,并且已经解决了上次无法连接数据库的问题.但是又遇到了一些新的小问题,希望明天 ...
- 通过ADO方式连接数据库
首先你正确安装了MySQL的数据库驱动程序(mysql-connector-odbc-5.1.6-win32.msi )或者64位的 本地连接: 1.在桌面上新建一个空的文本文件mysql.txt,重 ...
- jq实现登陆页面的拖拽功能
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <script src ...