【t005】数字构造问题
Time Limit: 1 second
Memory Limit: 50 MB
【问题描述】
给定一个只包含数字[0..9]的字符串,请使用字符串中的某些字符,构建一个能够整除15最大的整数。注意,字符串中的每个字符只能使用一次。 任务:求由给定字符串构造的能够整除15的最大整数
【输入】
共1行;
输入数据为一个只包含数字[0..9]字符串,字符串的长度为1..1000。如果无法构建出该数字,请输出“impossible”。
【输出】
输出一行数字串,表示能够整除15的最大整数。
【输入样例】
02041
【输出样例1】
4200
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t005
【题解】
/*
一个数字能被15整除;
则这个数的各个位上的数字的和是3的倍数;
末尾数字是0或5.
把所有的数字从大到小排序;
所有数字的和模3的结果;
1.如果为0
如果数字里面有0,则排序后0在最后面,则直接输出;
如果数字里面没有0,但是有5,则把1个5放在最后面;然后输出;
else
put("Impossible");
2.如果为1
则如果有余数为1的数字,选那个最小的,删掉它;
如果没有余数为1的数字,找两个余数为2的数字;
{
如果有0,则直接找两个最小的,删掉
如果没有0,则要考虑
是不是减掉一个5之后,还能找到两个余数为2的数字;
能则删掉;
}
是否删掉了数字使得所有数字的和%3==0?
是则根据有没有5和0,输出相应的答案;
否则无解;
2.如果为2
则如果有1个余数为2的数字;
{
如果有0,则直接找最小的那个删掉;
如果没有0,则要考虑
是不是减掉一个5之后,还能找到一个余数为2的数字;
能则删掉那个数字,否则"去找两个余数为1的数字",删掉;
}
没有
则去找两个余数为1的数字;
如果有就删掉最小的两个;
是否删掉了数字使得所有数字的和%3==0?
是则根据有没有5和0,输出相应的答案;
否则无解;
*/
【完整代码】
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1000+100;
string s;
int bo[3];
int a[MAXN],n,num = 0,t5 = 0,t0 = 0;
bool ok1;
bool cmp(int x,int y)
{
return x > y;
}
void find5()
{
for (int i = 1;i <= n;i++)
if (a[i]==5)
{
a[i]=-1;
a[n+1] = 5;
break;
}
}
void output()
{
int l = 1,r = n+1;
while (a[l]==0 || a[l]==-1) l++;
if (l>r)
puts("0");
for (int i = l;i <= n+1;i++)
if (a[i]!=-1)
printf("%d",a[i]);
}
void pd()
{
if (ok1)//如果删掉数了
{
if (t0)//有0就直接输出
{
output();
exit(0);
}
if (t5)//执行这一段就表示没0,则如果有5就把5移到最后输出
{
find5();
output();
exit(0);
}
}
//没完成删数或没有0和5就输出无解
puts("impossible");
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
cin >> s;
n = s.size();
for (int i = 0;i <= n-1;i++)
{
a[i+1] = s[i]-'0';
bo[a[i+1]%3]++;
num+=a[i+1];
if (a[i+1]==5) t5++;
if (a[i+1]==0) t0++;
}
sort(a+1,a+1+n,cmp);
a[n+1] = -1;
int x = num%3;
if (x==0)
{
if (t0)
{
for (int i = 1;i <= n;i++)
printf("%d",a[i]);
return 0;
}
if (t5)
{
find5();
for (int i = 1;i <= n+1;i++)
if (a[i]!=-1)
printf("%d",a[i]);
return 0;
}
puts("impossible");
return 0;
}
if (x==1)
{
ok1 = false;
if (bo[1])
{
for (int i = n;i >= 1;i--)
if (a[i]%3==1)
{
a[i] = -1;
break;
}
ok1 = true;
}
if (!ok1 && bo[2]>=2)
{
if (t0>0)//直接找两个余数为2的删掉(最小)
{
int cnt = 0;
for (int i = n;i >= 1;i--)
if (a[i]%3==2)
{
cnt++;
a[i] = -1;
if (cnt==2)
break;
}
ok1 = true;
}
//如果没有0,则还需要一个5
//看一下删掉一个5(所以你得先有一个5)
//之后还有没有两个余数为2的)->所以bo[2]>=3是条件
if (!ok1 && t5 && bo[2]>=3)
{
//如果5只有一个,就不能选5
bool ban5 = false;
int cnt = 0;
if (t5==1)
ban5 = true;
for (int i = n;i>=1;i--)
if (a[i]%3==2)
{
if (ban5)
if (a[i]==5)
continue;
a[i] = -1;
cnt++;
if (cnt==2)
break;
}
ok1 = true;
}
}
//删数完成,根据0和5的个数判断输出
pd();
}
if (x==2)
{
ok1 = false;
if (bo[2])
{
if (t0)
{
for (int i = n;i>=1;i--)
if (a[i]%3==2)
{
a[i] = -1;
break;
}
ok1 = true;
}
//如果下面这段执行是肯定没有0了
//则肯定要有一个5,减去5会让bo[2]--,所以bo[2]要大于1
if (!ok1 && t5 && bo[2]>1)
{
bool ban5 = false;
if (t5==1)
ban5 = true;
for (int i = n;i >= 1;i--)
if (a[i]%3==2)
{
if (ban5)
if (a[i]==5)
continue;
a[i] = -1;
break;
}
ok1 = true;
}
}
if (!ok1 && bo[1]>=2)
{
int cnt = 0;
for (int i = n;i >= 1;i--)
if (a[i]%3==1)
{
a[i] = -1;
cnt++;
if (cnt==2)
break;
}
ok1 = true;
}
pd();
}
return 0;
}
【t005】数字构造问题的更多相关文章
- 浅谈无字母数字构造webshell
0x00 问题 <?php include 'flag.php'; if(isset($_GET['code'])){ $code = $_GET['code']; if(strlen($cod ...
- 【t030】数字构造
Time Limit: 3 second Memory Limit: 256 MB [问题描述] 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行 ...
- TTTTTTTTTTTTTT CF 95 B 构造4,7幸运数字 贪心 构造 string
B. Lucky Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 涨姿势:抛弃字母、数字和下划线写SHELL
PHP中异或 (^) 的概念 <?php echo"A"^"?";?> <?php echo"A"^"?&quo ...
- java面试题总汇
coreJava部分 7 1.面向对象的特征有哪些方面? 7 2.作用域public,private,protected,以及不写时的区别? 7 3.String 是最基本的数据类型吗? 7 4.fl ...
- BZOJ 4724: [POI2017]Podzielno
Description 由\([0,B-1]\)的数字构造一个 \(B\) 进制数字,使得他是 \(B-1\) 的倍数. Sol 贪心+二分. 首先 \(X\) 是 \(B-1\) 的倍数,那么有 \ ...
- boost学习笔记(七)---date_time库
date_time库的日期基于格里高利历,支持从1400-01-01到9999-12-31之间的日期计算 #define BOOST_DATE_TIME_SOURCE #include <boo ...
- Winform开发框架之统计图表的实现
在前面的一些随笔中,介绍了不少我的Winform框架的特性,上篇随笔<Winform开发框架之通用高级查询模块>对其中的通用高级模块进了一个整理说明,本篇继续介绍Winform开发框架重要 ...
- [转载]Winform开发框架之统计图表的实现
在前面的一些随笔中,介绍了不少我的Winform框架的特性,上篇随笔<Winform开发框架之通用高级查询模块>对其中的通用高级模块进了一个整理说明,本篇继续介绍Winform开发框架重要 ...
随机推荐
- SQL-.db 数据库查看常用指令(转载)
一下内容转载自http://blog.sina.com.cn/s/blog_74dfa9f401017s69.html 简介sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在为熟悉sqlite3 ...
- JSON序列化和解析
1.JSON.stringfy()用于将 JavaScript 值转换为 JSON 字符串 2.JSON.parse()用于将一个 JSON 字符串转换为 JavaScript 对象. 3.JSON. ...
- 基于EmguCV的摄像机标定及矫正
标签: EmguCV摄像头标定C# 2015-05-03 14:55 501人阅读 评论(6) 收藏 举报 分类: C# 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] ...
- 00087_File
1.IO概述 (1)要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘.光盘.U盘等)上: (2)当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 ...
- 【几何/数学】概念的理解 —— (非)刚体变换((non-)rigid transformation)
1. 刚体变换与非刚体变换 What is a non-rigid transformation? 刚体变换(rigid transformation)一般分为如下几种: 平移对象,而不改变形状和大小 ...
- qemu 参数简介
参数 示例 说明 -hda -hda /data/windows.img 指定windows.img作为硬盘镜像 -cdrom -cdrom /data/windows.iso 指定windows.i ...
- 【Educational Codeforces Round 31 B】Japanese Crosswords Strike Back
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所有数字的和加上n-1,如果为x则唯一,否则不唯一 [代码] #include <bits/stdc++.h> usin ...
- PS中矢量形状图层的合并交叉等运算
操作中将用到下图所示的几个按钮 图1.2 减去顶层形状图层为例 1. 上图中,选择矩形工具,以新建图层的形式,新建两个矩形的形状图层,如上右图. PS:可以Shift+A快捷键选中一个形状,然后填 ...
- 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))
Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...
- amazeui学习笔记--js插件(UI增强2)--按钮交互Button
amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ...