Generalized Palindromic Number


Time Limit: 2 Seconds      Memory Limit: 65536 KB


A number that will be the same when it is written forwards or backwards is known as a palindromic number. For example, 1234321 is a palindromic number.

We call a number generalized palindromic number, if after merging all the consecutive same digits, the resulting number is a palindromic number. For example, 122111 is
a generalized palindromic number. Because after merging, 122111 turns into 121 which is a palindromic number.

Now you are given a positive integer N, please find the largest generalized palindromic number less than N.

Input

There are multiple test cases. The first line of input contains an integer T (about 5000) indicating the number of test cases. For each test case:

There is only one integer N (1 <= N <= 1018).

Output

For each test case, output the largest generalized palindromic number less than N.

Sample Input

4
12
123
1224
1122

Sample Output

11
121
1221
1121

Author: LIN, Xi

Source: The 2014 ACM-ICPC Asia Mudanjiang Regional First Round

解题思路:

题意为给定一个数n。求小于n的最大“回文数”, “回文数”要求连续同样的数能够压缩成一个数,比方1233221,能够压缩成12321,是回文数。

思路为暴力枚举,相当于填数字。首先枚举填左边第一个数字从大到小。然后在里面枚举右边有多少个和它一样的数,注意剪枝,左边当前数字假设符合题意的话,就不用再继续枚举当前数字了。由于要求最大。详细思路在代码凝视中。

參考:http://blog.csdn.net/u011345136/article/details/39122741

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define ll long long
const int maxn=20;
int Left[maxn],Right[maxn];//回文数左部分和右部分,比方 1511 ,左边存1 5 右边存 1 1
string str;//输入字符串
int len;//长度
ll n;//字符串代表的数字 ll lmax(ll a ,ll b)
{
return a>b?a:b;
} ll getNum(int l,int r)//获得当前回文数的值
{
ll ans=0;
for(int i=1;i<=l;i++)
ans=ans*10+Left[i];
for(int i=r;i>=1;i--)//注意存储的顺序,原数的最后一位是Left数组存储的第一位
ans=ans*10+Right[i];
return ans;
} ll dfs(int l,int r,int cur)//左边数字的个数l,右边数字的个数r,当前数字是否是边界。比方2511,第一位2就是边界,回文数该位要<=2。其它位就不是边界,能够从9開始
{
ll ans=-1;
if(l+r-1==len)//由于dfs參数中的l。dfs中给左边第l位赋值。而递归參数为l+1,所以当(l-1+r)=len时才是递归出口
{
ans=getNum(l-1,r);
if(ans>=n) return -1;//别忘了,不能大于等于给定的数 T T
return ans;
}
int now=cur? (str[l-1]-'0'):9;//给左边第l位赋值。推断是否为边界
for(int i=now;i>=0;i--)//枚举第l位
{
Left[l]=i;
//假设 当前l是第一位或者不是第一位但当前位和前一位不一样 且 不能l是第一位且i为0 且 数字还没有填完
if((l==1||(l>1&&Left[l]!=Left[l-1]))&&(!(l==1&&i==0))&&l+r!=len)
{
for(int k=1;l+r+k<=len;k++)//枚举右半部分与第l位同样的有多少位
{
Right[r+k]=i;
ans=lmax(ans,dfs(l+1,r+k,cur&&now==i));
}
}
else
{
ans=lmax(ans,dfs(l+1,r,cur&&now==i));
}
if(ans>0)//假设当前的ans符合题意,就不用再向下搜索了。比方455 第1位4找到一个数符合题意454,那么第一位就不用枚举3 2 1 0了剪枝
return ans;
}
return ans;
} int main()
{
int t;cin>>t;
while(t--)
{
cin>>str;
n=0;
len=str.length();
for(int i=0;i<len;i++)
n=n*10+str[i]-'0';
ll ans=dfs(1,0,1);
cout<<ans<<endl;
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

[ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)的更多相关文章

  1. ZOJ - 3816 Generalized Palindromic Number dfs

    Generalized Palindromic Number Time Limit: 2 Seconds                                     Memory Limi ...

  2. ACM: FZU 2107 Hua Rong Dao - DFS - 暴力

    FZU 2107 Hua Rong Dao Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  3. ACM: Gym 100935G Board Game - DFS暴力搜索

    Board Game Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u  Gym 100 ...

  4. hdu 5612 Baby Ming and Matrix games(dfs暴力)

    Problem Description These few days, Baby Ming is addicted to playing a matrix game. Given a n∗m matr ...

  5. PAT 甲级 1019 General Palindromic Number(简单题)

    1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  6. 玲珑杯”ACM比赛 Round #4 1054 - String cut 暴力。学到了扫描的另一种思想

    http://www.ifrog.cc/acm/problem/1054 问删除一个字符后的最小循环节是多少. 比赛的时候想不出,不知道怎么暴力. 赛后看了别人代码才晓得.唉,还以为自己字符串还不错, ...

  7. HDU 4770 Lights Against Dudely 暴力枚举+dfs

    又一发吐血ac,,,再次明白了用函数(代码重用)和思路清晰的重要性. 11779687 2014-10-02 20:57:53 Accepted 4770 0MS 496K 2976 B G++ cz ...

  8. Codeforces Beta Round #51 B. Smallest number dfs

    B. Smallest number Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/pro ...

  9. General Palindromic Number (进制)

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

随机推荐

  1. aStar算法求第k短路

    A*的概念主意在于估计函数,f(n)=g(n)+h(n),f(n)是估计函数,g(n)是n节点的当前代价,h(n)是n节点的估计代价:而实际中,存在最优的估计函数f'(n)=g'(n)+h'(n),那 ...

  2. 构造Nexus,仓库部署成员Nexus仓

    在一个,我们描述了如何配置安装nexus制,本节,我们来介绍nexus采用 1.登录 在红色的部分点击登陆.输入username与password admin/admin123. 这里能够配置nexu ...

  3. 使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响?

    使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响? 1.问题:各操作间或者性能上会不会有影响? 如果有该如何解决? 多用户操作的影响主要是回锁定记录,oracl ...

  4. Angularjs 基于karma和jasmine的单元测试

    目录: 1. 单元测试的配置 2. 实例文件目录解释 3. 测试controller     3.1 测试controller中变量值是否正确     3.2 模拟http请求返回值,测试$http服 ...

  5. Windows Phone开发(25):启动器与选择器之WebBrowserTask

    原文:Windows Phone开发(25):启动器与选择器之WebBrowserTask 从名字上就看出来,这个家伙就是打开浏览并浏览到指定页面. 它有两个用途完全一样的属性:Uri属性是Syste ...

  6. Windows7在自由的虚拟机(微软官方虚拟机)

    Windows7在自由的虚拟机(微软官方虚拟机) 前言: 不是说windows7自带的虚拟机最好用,但他的正式版.免费.只是希望你能windows7用户.它将能够自由使用: 还是Vmware. 微软为 ...

  7. lua简洁的功能(两)

    Lua中的函数带有词法定界的第一类值. 第一类值: 在Lua中,函数和其它值(数值,字符串)一样,函数能够被存放在变量中,也存放在表中, 能够作为函数的參数,还能够作为函数的返回值. 词法定界:被嵌套 ...

  8. 【leetcode】LRU

    import java.util.HashMap; import java.util.Map; public class LRUCache { private int capacity; privat ...

  9. WPF 3D:MeshGeometry3D的定义和光照

    原文 WPF 3D:MeshGeometry3D的定义和光照 由于WPF计算光照会根据整个平面的方向向量,所以如果在不同面上使用同一个点可能会达到不同的光照效果.让我们用不同的定义Mesh的方法来演示 ...

  10. HTML5_文本元素

    <!DOCTYPE html> <hmtl> <html  lang="zh-en"> <head> <meta  chars ...