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. 关于bind函数和connect函数的测试结论

    1. 一般客户端不用绑定,系统给你自动分配(有些ip不是固定的,bind也不是一个好方法):而服务器需要绑定,因为需要给客户端一个众所周知的固定的地址: 2. 关于bind错误,可以用WSAGetLa ...

  2. 域名注册查询接口(API)的说明

    1.域名查询 接口采用HTTP,POST,GET协议: 调用URL:http://panda.www.net.cn/cgi-bin/check.cgi 参数名称:area_domain 值为标准域名, ...

  3. 【翻译】Why JavaScript Is and Will Continue to Be the First Choice of Programmers

    花费2半小时,那么最终会被翻译.假设有问题,请提出,毕竟,自己的6不超过级别. 附加链接 Why JavaScript Is and Will Continue to Be the First Cho ...

  4. 上delloc 无呼叫 故障排除 笔记

    经验 delloc 无呼叫 基本上可以得出结论,即循环引用的原因. 遇到这样的情况基本上可分为 1: 属性声明weak的地方 写成了 strong  .比方delegate. 2: block语法块中 ...

  5. GPS 偏移校正(WGS-84) 至(GCJ-02) java版本号以实现

    public class EvilTransform { final static double pi = 3.14159265358979324; // // // a = 6378245.0, 1 ...

  6. linux下一个C语言flock功能使用 .

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依參数operation所指 ...

  7. 更具体的描述JNI

    JNI事实上,Java Native Interface缩写,也就是说,java本地接口. 它提供了许多API实现和Java并与其他语言的沟通(主要C&C++). 也许很多人认为Java够劲. ...

  8. 取证学习资料DVD

    http://www.infiniteskills.com/training/learning-computer-forensics.html https://www.youtube.com/watc ...

  9. mysqldump 命令的使用

    1.导出结构不导出数据 mysqldump -d databasename -uroot -p > xxx.sql 2.导出数据不导出结构 mysqldump -t databasename - ...

  10. Interpolator(插值器)的种类

    Interpolator(插值器)的种类 Interpolator被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeat ...