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

 

转载于:https://www.cnblogs.com/fxh19911107/archive/2012/03/17/2404035.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值