zoukankan      html  css  js  c++  java
  • sdut newoj 2222 And Now, a Remainder from Our Sponsor

    http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2222

    不算一个难题,就是刚一开始读题的时候感觉,题目真的好绕啊。题目的意思就是给你 一串字符串,三个一组(空格也算一个字符)的分开,按照它给的标准把这些字符串变成六位数一组的串,如果某个字符串最后不足三个,那么就用空格填充。然后呢,题目的输入是任意给你四个数字,让你用刚刚得到的那几个六位数依次对这四个数取余,会得到四个余数,然后把这四个余数连接起来,会得到一个新的字符串,(记住,如果不是第一个余数,并且余数小于10那么就加前导零把它扩充为2位数)然后这个字符串就是题目输入中,四个关键字(数字)后面的那n个字符串中的一个,也就是说,题目中n是几,后面就有多少个由余数组成的字符串,同时也说明要求的那个字符串被分成了几个六位数。现在题目把四个数,和n个余数组成的字符串给你了,让你求出这个字符串。

    看到题目并且真正理解了之后,我的第一感觉就是暴搜,因为字符串开头最小是AAA即为 010101,最大是三个空格 即 272727这样才是 10^5,字符串最大是50个,这样即使不剪枝也是能挤过去的,当然加了剪枝后运行速度更快

    思路:从10101到272727循环,对四个数取余,把余数连接起来组成字符串,然后去给定的字符串里面比较,如果能找到,则说明 i 对应的这个数是要找的数,把它对应的放到要输出的那个数组的对应位置就好了,用一个V数组标记给定的字符串是否都被标记,如果是则退出循环,说明已经找完了

    这道题目要感谢队友,一开始写出来少考虑了好多情况,都是他一一给加上去才A了的

      1 #include<stdio.h>
    2 #include<string.h>
    3 #include<iostream>
    4 using namespace std;
    5 #define N 100
    6 char str[N];
    7 char b[2*N];
    8 int v[N];
    9 int key[4];
    10 struct node
    11 {
    12 char sdr[N];
    13 int de;
    14 }a[N];
    15 int main()
    16 {
    17 int i,j,t;
    18 int n;
    19 cin>>t;
    20 while(t--)
    21 {
    22 memset(a,0,sizeof(a));
    23 memset(v,0,sizeof(v));
    24 memset(b,0,sizeof(b));
    25 cin>>n>>key[0]>>key[1]>>key[2]>>key[3];
    26 for(i=0;i<n;i++)
    27 {
    28 scanf("%s",a[i].sdr);
    29 //cin>>a[i].sdr;
    30 a[i].de=i;
    31 }
    32 char sbr[10],sar[10];
    33 for(i=10101;i<=272727;i++)
    34 {
    35 int ttt=i;
    36 int ia, ib, ic;
    37 ic = ttt % 100;
    38 ttt /= 100;
    39 ib = ttt % 100;
    40 ttt /= 100;
    41 ia = ttt;
    42 if(ia>27||ib>27||ic>27) continue; //因为字符串中最大为空格 27 所以把这六个数才分开如果有一个大于 27 则直接进行下一个查找。一个判断剪枝,直接让程序从 953ms 到了 93ms
    43 memset(str,0,sizeof(str));
    44 for(j=0;j<4;j++)
    45 {
    46 int cnt=i%key[j];
    47 int g=cnt;
    48 int k=0;
    49 if (!cnt)
    50 {
    51 strcat (str, "00");
    52 continue;
    53 }
    54 while(cnt)
    55 {
    56 sbr[k++]=(cnt%10)+'0';
    57 cnt/=10;
    58 }
    59 if(g<10&&j!=0) sbr[k++]='0';
    60 int m=0;
    61 for(int h=k-1;h>=0;h--)
    62 {
    63 sar[m++]=sbr[h];
    64 }
    65 sar[m]='\0';
    66 strcat(str,sar);
    67 }
    68 for(int tt=0;tt<n;tt++)
    69 {
    70 if(!strcmp(str,a[tt].sdr)&&!v[tt])
    71 {
    72 v[tt]=1;
    73 int kk=tt*3;
    74 if(ia==27) b[kk++]=' ';
    75 else b[kk++]=ia+'A'-1;
    76 if(ib==27) b[kk++]=' ';
    77 else b[kk++]=ib+'A'-1;
    78 if(ic==27) b[kk++]=' ';
    79 else b[kk++]=ic+'A'-1;
    80 }
    81 }
    82 int flag=0;
    83 for(int w=0;w<n;w++)
    84 {
    85 if(!v[w])
    86 {flag=1;break;}
    87 }
    88 if(!flag)
    89 break;
    90 }
    91 int ilen = strlen (b);
    92 for (int w = ilen - 1; w >= 0; --w)
    93 {
    94 if (b[w] == ' ')
    95 {
    96 --ilen;
    97 }
    98 else
    99 {
    100 break;
    101 }
    102 }
    103 b[ilen] = '\0';
    104 printf ("%s\n", b);
    105 }
    106 return 0;
    107 }
    108
  • 相关阅读:
    [BZOJ1584] [Usaco2009 Mar]Cleaning Up 打扫卫生(DP)
    [BZOJ1583] [Usaco2009 Mar]Moon Mooing 哞哞叫(队列)
    [BZOJ1582] [Usaco2009 Hol]Holiday Painting 节日画画(线段树)
    [BZOJ1579] [Usaco2009 Feb]Revamping Trails 道路升级(分层图最短路 + 堆优化dijk)
    [ZPG TEST 115] 字符串【归类思想】
    [ZPG TEST 114] 阿狸的英文名【水题】
    [USACO 2012 Open Gold] Bookshelf【优化dp】
    [USACO 2012 Mar Silver] Landscaping【Edit Distance】
    [USACO 2012 Mar Gold] Large Banner
    [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
  • 原文地址:https://www.cnblogs.com/fxh19911107/p/2404035.html
Copyright © 2011-2022 走看看