【枚举+贪心】POJ2718-Smallest Difference
【题目大意】
按升序输出几个不同的数字,任意组成两个数字,输出最小的差值。
【思路】
虽然是在穷竭搜索的章节里找到的题目,但是我觉得不需要穷竭搜索,枚举一下就可以了,0MS。分为一下三种情况:
(1)如果只有两个数字,且其中第一个数字为0,则第二个数字就是答案。
(2)如果有奇数个数字,分为长度为l+1和l的两部分,则较大数为从小到大的l+1个数字,较小数为从大到小的l个数字。如果首位是0,就和第二个数字预先交换位置。
(3)如果有偶数个数字,则两个数字长度必定一致。枚举两个数的首位数字,较大数在余下数字汇总由小到大取,较小数由大到小取即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int MAXN=+;
using namespace std;
char s[MAXN];
int digit[MAXN];
int leng; int per()
{
int num1,num2;
int ans=0x7fffffff;
for (int i=;i<leng;i++)
for (int j=i+;j<=leng;j++)
{
if (digit[i]== || digit[j]==) continue;
num1=digit[j],num2=digit[i]; int t=,p=-;
while (t<leng/)
{
p++;
if (p==i || p==j) continue;
t++;
num1=num1*+digit[p];
} t=,p=leng+;
while (t<leng/)
{
p--;
if (p==j || p==i) continue;
t++;
num2=num2*+digit[p];
}
if (num1-num2<ans) ans=num1-num2;
}
return (ans);
} int odd()
{
int num1=,num2=;
if (digit[]==) swap(digit[],digit[]);
for (int i=;i<=leng/;i++) num1=num1*+digit[i];
for (int i=leng;i>leng/;i--) num2=num2*+digit[i];
return (num1-num2);
} int main()
{
int kase;
scanf("%d",&kase);
getchar();
for (int cases=;cases<kase;cases++)
{
gets(s);
leng=-;
for (int i=;i<strlen(s);i+=)
{
leng++;
digit[leng]=s[i]-'';
} if (leng== && digit[]==) cout<<digit[]<<endl;
else
{
if ((leng+)%==) cout<<odd()<<endl;
else cout<<per()<<endl;
}
} return ;
}
【枚举+贪心】POJ2718-Smallest Difference的更多相关文章
- poj2718 Smallest Difference(dfs+特判,还可以贪心更快)
https://vjudge.net/problem/POJ-2718 其实不太理解为什么10超时了.. 这题似乎是有贪心优化的方法的,我下面直接暴力了.. 暴力之余要特判两个点:1.超时点就是n=1 ...
- POJ-2718 Smallest Difference
http://poj.org/problem?id=2718 从一些数里面选择一个子集组成一个数,余下的数组成另外一个数,(数不能以0开头)问两个数的差的绝对值最小是多少! 不管是奇数还是偶数,要想绝 ...
- (DFS、全排列)POJ-2718 Smallest Difference
题目地址 简要题意: 给若干组数字,每组数据是递增的在0--9之间的数,且每组数的个数不确定.对于每组数,输出由这些数组成的两个数的差的绝对值最小是多少(每个数出现且只出现一次). 思路分析: 对于n ...
- poj2718 Smallest Difference
思路: 暴力乱搞. 实现: #include <iostream> #include <cstdio> #include <sstream> #include &l ...
- POJ 2718 Smallest Difference(贪心 or next_permutation暴力枚举)
Smallest Difference Description Given a number of distinct decimal digits, you can form one integer ...
- POJ 2718 Smallest Difference dfs枚举两个数差最小
Smallest Difference Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19528 Accepted: 5 ...
- POJ 2718 Smallest Difference(最小差)
Smallest Difference(最小差) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 Given a numb ...
- 【POJ - 2718】Smallest Difference(搜索 )
-->Smallest Difference 直接写中文了 Descriptions: 给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数.剩余元素可以用相同规则构建第二个数. ...
- LintCode "The Smallest Difference"
Binary search. class Solution { int _findClosest(vector<int> &A, int v) { , e = A.size() - ...
随机推荐
- 变量对象vs活动对象
这是我见过描述的最为详尽的关于变量对象.活动对象以及闭包的解析,来自知乎,感谢答主: 作者:闭家锁链接:https://www.zhihu.com/question/36393048/answer/7 ...
- AndroidStudio获得发布版安全码SHA1
耗了一下午才搞定 在cmd中: 1.打开keytool的目录:即JDK的安装目录 2.输入口令: (E:\tenyears\tenyears\app是keystore文件的目录)
- aspxpivotgrid 导出excel时,非绑定咧显示为0的情况
using DevExpress.XtraPrinting; Exporter.ExportXlsToResponse(this.Title,TextExportMode.Text,true); // ...
- UIResponder简介
1.简介 在使用设备的时候我们大多时候是但手指触摸控件了进行的,比如点击密码按钮解锁,上下浏览网页等动作.你肯定也摇动过iphone抢红包和***等等,我们的系统可以处理这些事件则都需要去使用UIRe ...
- 1.ubuntu的安装
分两种 1. 在VMware中安装,则与Centos的安装类似 2. 在VirtualBox里安装 --> 1. 先“新建” 一个虚拟电脑 2. 根据需求编辑虚拟电脑的信息 (具体的大小.内存等 ...
- django使用JWT保存用户登录信息
在使用前必须弄明白JWT的原理,原理可以看我的另一篇博文:https://www.cnblogs.com/chichung/p/9966027.html JWT的流程 1.签发JWT 在用户正确输入账 ...
- AC日记——Sagheer and Crossroads codeforces 812a
812A - Sagheer and Crossroads 思路: 模拟: 代码: #include <cstdio> #include <cstring> #include ...
- 前端读者 | 如何判断Javascript对象是否存在
本文来自@阮一峰 Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言 ...
- localStorage和sessionStorage的总结
localStorage:没有时间限制的数据存储 API: 1.localStorage.setItem('name','wangwei')/localStorage.name='wangwei'存储 ...
- sql 时间日期格式化
sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...