题意:

给定一个固定长度的字符串, 字符串是一个含有前导0的数字, 问这个数字加上多少能构成一个回文字符串。

分析:

其实这题有很多种方法, 方法12是我做完后看别人代码总结的, 方法3是我当时想的一种方法。

方法一:

最直观的想法,从这个数字开始枚举, 知道找到回文字符串为止。

注意 %0'length‘d 可以输出前导0 , 比如 %03d输出1的话就是 ”001“

另外代码需要注意效率, 不然容易超时。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int len;
  4. bool pre(const char a[]){//判断是否回文串
  5. for(int i = , j = len - ; i < j; i++, j--){
  6. if(a[i] != a[j])
  7. return false;
  8. }
  9. return true;
  10. }
  11. int main(){
  12. char str[];
  13. while(scanf("%s", str )){
  14. len = strlen(str);
  15.  
  16. if (len == ) break;
  17.  
  18. int i = , n = atoi(str);//先将str转化为int
  19.  
  20. char print[], buf[];
  21.  
  22. sprintf(print, "%%0%dd", len);//构造出“%0'长度'd”的字符串, 方便下面sprintf输出前导0
  23.  
  24. memcpy(buf,str,len);//可以将枚举数组设为buf, 就不用更改原来数组了
  25.  
  26. while(!pre(buf)){//枚举即可
  27. i++;
  28. sprintf(buf,print, n + i);
  29. }
  30. printf("%d\n", i);
  31.  
  32. }
  33. }

方法二:

构造出最接近的回文串, 方法是从判断每一对回文, 如果高位大于低位, 低位更改为高位, 否则低位的前一位进一, 低位更改为高位。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int len;
  4. int a[];
  5. char s[];
  6. void carry(){
  7. for(int i = len - ; i >= ; i --){
  8. if(a[i] >= ){
  9. a[i-] ++;
  10. a[i] %= ;
  11. }
  12. }
  13. }
  14. bool change(){
  15. for(int i = , j = len - ; i < j; i++, j--){
  16. if(a[i] > a[j]){
  17. a[j] = a[i];//位置对应的高低位, 如果高位大于低位的, 后面直接更改为低位
  18. }else if(a[j] > a[i]){
  19. a[j] = a[i];//否则 如果低位大于高位的, 低位的前一位++, 低位改为高位
  20. a[j-] ++;
  21. carry();
  22. return true;//进位后要重新进行一次change(), 因为进位的可能是之前已经判断过的字符
  23. }
  24. }
  25. return false;
  26. }
  27. int main(){
  28. while(scanf("%s", s)){
  29. len = strlen(s);
  30. if(len == ) break;
  31. int n1, n2;
  32. sscanf(s,"%d", &n1);
  33. for(int i = ; i < len; i++){
  34. a[i] = s[i] - '';
  35. }
  36. a[len] = ;
  37. while(change());
  38. n2 = ;
  39. for(int i = len - ; i >=;i--){
  40. n2 *= ;
  41. n2 += a[i];
  42. }
  43. printf("%d\n", n2 - n1);
  44. }
  45. return ;
  46. }

方法三:

我自己的想法是判断最内层的非回文对, 如果高位大于低位, 那么低位以及低位之后的都更改为高位的回文,

否则的话, 偶数情况中间两个字符中较小的(同样大小取高位),奇数情况则直接取中间的数, 这个数字+1, 如果有进位先进位。

然后这个数字之后的所有数字都更改为与之对应的高位, 那么就是回文串。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int len;
  5. int main(){
  6. char s[];
  7. while(scanf("%s", s)){
  8. int len = strlen(s);
  9. int n1, n2;
  10. sscanf(s,"%d",&n1);
  11.  
  12. if (len == ){
  13. break;
  14. }
  15. int k = -, i;
  16.  
  17. for(i = ; i < len/; i++){
  18. if(s[i] != s[len - i - ]){
  19. k = i;
  20. }
  21. }
  22. if(k == -){
  23. printf("0\n");
  24. continue;
  25. }
  26. // printf("k : %d\n", k);
  27. if( s[len - k - ] < s[k]){//如果最里面不同一对的低位 小于高位 改这一对的后面
  28. s[len-k-] = s[k];
  29. int cnt = ;
  30. for(int i = len-k; i < len; i++){
  31. s[i] = s[len - i - ];
  32. }
  33. }
  34. else // 只能改中间
  35. {
  36. int mid;
  37. if(len % == ){//偶数情况哪个小要哪个
  38. mid = s[len/-] <= s[len/] ? len/-: len/;
  39. }
  40. else{
  41. mid = len/;
  42. }
  43.  
  44. s[mid]++;
  45. for(int i = mid; i >= ; i--){
  46. if(s[i] > ''){
  47. s[i] = '';
  48. s[i-]++;
  49. }
  50. }
  51. for(int i = mid+; i < len; i++){
  52. s[i] = s[len-i-];
  53. }
  54.  
  55. }
  56. sscanf(s,"%d",&n2);
  57. printf("%d\n", n2 - n1);
  58.  
  59. }
  60. return ;
  61. }

UVaLive 4868 Palindrometer (暴力 / 构造)的更多相关文章

  1. UVALive 4868 Palindrometer 暴力

    F - Palindrometer Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...

  2. 暴力+构造 Codeforces Round #283 (Div. 2) C. Removing Columns

    题目传送门 /* 题意:删除若干行,使得n行字符串成递增排序 暴力+构造:从前往后枚举列,当之前的顺序已经正确时,之后就不用考虑了,这样删列最小 */ /*********************** ...

  3. Codeforces Round #306 (Div. 2)A B C D 暴力 位/暴力 暴力 构造

    A. Two Substrings time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  4. UVALive 7269 Snake Carpet (构造)

    题目:传送门. 题意:构造出一个矩阵,使得矩阵含有n条蛇,每条蛇的长度是1到n,并且奇数长度的蛇有奇数个拐弯,偶数长度 的蛇有偶数个拐弯. 奇数和偶数分开构造,奇数可以是: 1357 3357 555 ...

  5. UVALive 6088 Approximate Sorting 构造题

    题目链接:点击打开链接 题意: 给定一个n*n的01矩阵 我们跑一下例子== 4 0111 0000 0100 0110 0123 \|____ 0|0111 1|0000 2|0100 3|0110 ...

  6. Karen and Game CodeForces - 816C (暴力+构造)

    On the way to school, Karen became fixated on the puzzle game on her phone! The game is played as fo ...

  7. UVALive 5107 dfs暴力搜索

    题目链接:A hard Aoshu Problem DES:给三个字符串,包含的字符是A-E范围内的.长度都不超过8.每个字符可以而且只可以匹配一个数字.两个字符不能匹配相同的数字.前两个式子之间可以 ...

  8. UVALive 5844 dfs暴力搜索

    题目链接:UVAive 5844 Leet DES:大意是给出两个字符串.第一个字符串里的字符可以由1-k个字符代替.问这两个字符串是不是相等.因为1<=k<=3.而且第一个字符串长度小于 ...

  9. Codeforces Round #487 (Div. 2) A Mist of Florescence (暴力构造)

    C. A Mist of Florescence time limit per test 1 second memory limit per test 256 megabytes input stan ...

随机推荐

  1. 图论/暴力 Codeforces Beta Round #94 (Div. 2 Only) B. Students and Shoelaces

    题目传送门 /* 图论/暴力:这是个连通的问题,每一次把所有度数为1的砍掉,把连接的点再砍掉,总之很神奇,不懂:) */ #include <cstdio> #include <cs ...

  2. Java中的流(1)流简介

    简介 1.在java中stream代表一种数据流(源),java.io的底层数据元.(比作成水管)2.InputStream 比作进水管,水从里面流向你,你要接收,read3.OutputStream ...

  3. Android开发学习——ButterKnife使用

    为了码代码的效率,我们有了ButterKnife;其基本使用如下步骤: 1.在Android Studio的Setting中,下载plugin 2.在整个Project的build.gradle中添加 ...

  4. CF919D Substring

    思路: 拓扑排序过程中dp.若图有环,返回-1. 实现: #include <bits/stdc++.h> using namespace std; ; vector<int> ...

  5. css中display设置为table、table-row、table-cell后的作用及其注意点

    html: <div class="table"> <div class="row"> <div class="cell ...

  6. orcale 数据库的一些知识

    最近学了一些Oracle数据库的知识,我想自己整理一下,以后也方便自己查阅的. orcale 数据库登录(tiger) 1. sql plus 登录 用户名: sys 口令: 主机字符串:orcl a ...

  7. IntelliJ IDEA安装与破解

    1.软件下载 文中使用到的安装包下载 2.部署 安装一路下一步即可. 把下载的JetbrainsCrack-3.1-release-enc.jar放在安装目录的bin目录下 3.修改配置文件 在安装的 ...

  8. Quartz2D知识点聚合案例

    Quartz2D知识点聚合 基本 //画图片 UIImage *image = [UIImage imageNamed:@"阿狸头像"]; [image drawInRect:re ...

  9. css选择器的对比样式代码精简

    通常就分为这三大类:* 选定所有对象.通配选择符(Universal Selector)通常不建议使用通配选择符,因为它会遍历并命中文档中所有的元素,出于性能考虑,需酌情使用一.标签选择器,以开始标签 ...

  10. VC++模拟一次鼠标点击返回原位置

    HWND h; RECT r1; POINT p;//x,y void ONCE() { h=::FindWindow(NULL,"biaoti"); ::GetWindowRec ...