URAL--1007 codewords

落日映苍穹つ 2022-08-11 00:44 286阅读 0赞

三种信息传递过程中可能出错的方式,让你恢复原来正确的信息。

我用的是分类暴搜,用字符串模拟的,这里还是是可行的,不过debug快坑死了o(╯□╰)o……

后面还有一个别人的用string写的,感觉挺不错的……

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<iostream>
  5. using namespace std;
  6. int n;
  7. int main()
  8. {
  9. scanf("%d",&n);
  10. char word[1005],tmp[1005];
  11. memset(word,0,sizeof(word));
  12. while (scanf("%s",word)!=EOF)
  13. {
  14. int len=strlen(word),i,sum=0,j;
  15. if (len==n)
  16. {
  17. for (i=len-1;i>=0;i--)
  18. if (word[i]=='1')sum+=len-i;
  19. if (sum%(n+1)==0)printf("%s\n",word);
  20. else
  21. {
  22. for (j=len-1;j>=0;j--)
  23. if (word[j]=='1')
  24. {
  25. sum=0;
  26. word[j]='0';
  27. for (i=len-1;i>=0;i--)
  28. if (word[i]=='1')sum+=len-i;
  29. if (sum%(n+1)==0)
  30. {
  31. printf("%s\n",word);
  32. break;
  33. }
  34. else word[j]='1';
  35. }
  36. }
  37. }
  38. else if (len<n)
  39. {
  40. for (j=n-1;j>=0;j--)
  41. {
  42. memset(tmp,0,sizeof(tmp));
  43. for (i=0;i<j;i++)
  44. tmp[i]=word[i];
  45. for (i=j;i<len;i++)
  46. tmp[i+1]=word[i];
  47. tmp[j]='1';
  48. sum=0;
  49. for (i=len;i>=0;i--)
  50. if (tmp[i]=='1')sum+=n-i;
  51. if (sum%(n+1)==0)
  52. {
  53. printf("%s\n",tmp);
  54. break;
  55. }
  56. tmp[j]='0';
  57. sum=0;
  58. for (i=len;i>=0;i--)
  59. if (tmp[i]=='1')sum+=n-i;
  60. if (sum%(n+1)==0)
  61. {
  62. printf("%s\n",tmp);
  63. break;
  64. }
  65. }
  66. }
  67. else
  68. {
  69. for (j=len-1;j>=0;j--)
  70. {
  71. for (i=0;i<j;i++)
  72. tmp[i]=word[i];
  73. for (i=j;i<len;i++)
  74. tmp[i]=word[i+1];
  75. sum=0;
  76. for (i=len-1;i>=0;i--)
  77. if (tmp[i]=='1')sum+=n-i;
  78. if (sum%(n+1)==0)
  79. {
  80. printf("%s\n",tmp);
  81. break;
  82. }
  83. }
  84. }
  85. memset(word,0,sizeof(word));
  86. }
  87. return 0;
  88. }

测试数据:












input output
  1. 4
    0000
    011
    1011
    11011
  1. 0000
    0110
    1001
    1111




看到了别人用string写的,感觉代码短小精悍就拿了过来,不过时间稍长,但不会超时…

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int n;
  5. bool count(string &s)
  6. {
  7. int k = 0;
  8. for(int i = 1 ; i <= n ; i++)
  9. if(s[i - 1] == '1') k += i;
  10. return k % (n + 1) == 0;
  11. }
  12. void work()
  13. {
  14. string s;
  15. cin >> n;
  16. while(cin >> s)
  17. {
  18. if(s.length() == n && count(s)) goto end;
  19. if(s.length() == n)
  20. for(int i = 1 ; i <= n ; i++)
  21. if(s[i - 1] == '1')
  22. {
  23. s[i - 1] = '0';
  24. if(count(s)) goto end;
  25. s[i - 1] = '1';
  26. }
  27. if(s.length() < n)
  28. for(int i = 1 ; i <= n ; i++)
  29. {
  30. s.insert(i - 1, "1");
  31. if(count(s)) goto end;
  32. s.erase(i - 1, 1);
  33. s.insert(i - 1, "0");
  34. if(count(s)) goto end;
  35. s.erase(i - 1, 1);
  36. }
  37. if(s.length() > n)
  38. for(int i = 1 ; i <= n ; i++)
  39. {
  40. string tmp = s.substr(i - 1, 1);
  41. s.erase(i - 1, 1);
  42. if(count(s)) goto end;
  43. s.insert(i - 1, tmp);
  44. }
  45. end:
  46. cout << s << endl;
  47. }
  48. }
  49. int main()
  50. {
  51. work();
  52. return 0;
  53. }











input output
  1. 4
    0000
    011
    1011
    11011
  1. 0000
    0110
    1001
    1111




发表评论

表情:
评论列表 (有 0 条评论,286人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ZROI#1007

    [ZROI\1007][ZROI_1007] 也是看起来非常不可做的一个题. 仔细思考,发现了一个很\\(cooooool\\)的事情: 他是不是让我求最小独立集覆盖..

    相关 1007 级数求和

    题目描述 Description 已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。   现给出一个整数K(1<=k<=

    相关 URAL--1007 codewords

    三种信息传递过程中可能出错的方式,让你恢复原来正确的信息。 我用的是分类暴搜,用字符串模拟的,这里还是是可行的,不过debug快坑死了o(╯□╰)o...... 后面还有一

    相关 P1007 独木桥

    题目背景 战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景

    相关 PAT乙级1007

    1007 素数对猜想(20 分) 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻

    相关 URAL 1029

    题目大意:M层N列的矩阵(各元素均为正整数),找出一个路径从第一层到达第M层,使得路径上的所有数的和是所有可达路径中最小的,每次上到下一层以后就不能再上去,依次输出路径上的各点