zoj 3816 Generalized Palindromic Number(暴力枚举)

2024-06-05 02:18

本文主要是介绍zoj 3816 Generalized Palindromic Number(暴力枚举),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:zoj 3816 Generalized Palindromic Number

题目大意:给定n,找一个最大的数x,保证x小于n,并且x为palindromic number

解题思路:枚举前i个放于n相同的数,然后去构造后半部分即可。

#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
typedef unsigned long long ll;int n = 0, bit[30], num[30], ans[30];bool judge(int* a, int* b, int n) {for (int i = n - 1; i >= 0; i--) {if (a[i] != b[i])return a[i] > b[i];}return false;
}bool cmp (int* a, int* b, int d) {for (int i = 1; i <= d; i++) {if (a[n-i] != b[n-i])return a[n-i] > b[n-i];}return false;
}void dfs (int d, int p, bool flag) {if (d < p) {if (judge(bit, num, n) && judge(num, ans, n))memcpy(ans, num, sizeof(num));return;}int end = (flag ? bit[d] : 9);for (int i = end; i >= 0; i--) {int v = p;if (cmp(ans, num, n - d - 1))return;num[d] = i;if (num[d] != num[d+1]) {while (v <= d) {num[v++] = num[d];dfs(d - 1, v, flag && i == end);}} elsedfs(d - 1, p, flag && i == end);}
}ll solve () {ll a;scanf("%llu", &a);memset(ans, 0, sizeof(ans));memset(bit, 0, sizeof(bit));memset(num, 0, sizeof(num));n = 0;while (a) {bit[n++] = a % 10;a /= 10;}num[n] = 0;dfs(n-1, 0, 1);ll ret = 0;for (int i = n - 1; i >= 0; i--)ret = ret * 10 + ans[i];return ret;
}int main () {int cas;scanf("%d", &cas);while (cas--) {printf("%llu\n", solve());}return 0;
}

这篇关于zoj 3816 Generalized Palindromic Number(暴力枚举)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031793

相关文章

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2