开始做noip的套题。
做完这道题想把它记下来。题目不难,模拟即可,考察的是字符串的处理。
本题真正值得注意的是全面考虑问题,这也是noip模拟题重点考察的内容。包括noip 2003 侦探推理。
这两道题都是模拟,但是特判的情况很多。以本题为例,我没有考虑【两个--】的情况,【-在开头】的情况,和【字母-数字】,【数字-字母】的情况
而且数组大小估计错误,蹦了一个点。
第一编写完只有40分。
经过思考,加上了【-在开头】的情况,和【字母-数字】,【数字-字母】三种情况,70分;
最后比对数据,才意识到【两个--】的情况和超内存的问题,改后AC;
另外,当初侦探推理那道题写完只有20分,几乎是对照数据一个点一个点改过的。。。。= =
客观的说,这两道题的数据都是很科学的,每种情况都有对应的1、2个点,几乎是加一个特判过一个点。
总之,通过做此题,发现几个要注意的问题:
第一、认真审题,认真分析!!!!! 虽然老生常谈了,但是每次都会忽略。尤其是搜索和模拟,注意特判和剪枝以及不合法情况!!!!!!
第二、仔细分析时间复杂度和空间复杂度。 其实说白了还是要认真分析问题。如果空间或时间分析错误就太可惜了。
第三、多做测试。不要以为题中的测试数据很强大。其实题中的数据通常蒟蒻!甚至会故意坑人。总之,要不怕麻烦,自己设计数据,而且要注意极端数据。
附带本题代码

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 int a,b,c; 5 char x[500000],t[500000]; 6 int main() 7 { 8 freopen("expand.in","r",stdin); 9 freopen("expand.out","w",stdout); 10 scanf("%d%d%d",&a,&b,&c); 11 scanf("%s",x); 12 char temp[500000]; 13 int e=strlen(x); 14 int i,j,k,w,s; 15 k=0; 16 for (i=0;i<e;i++) 17 { 18 if ('a'<=x[i]&&x[i]<='z') {t[k++]=x[i];} 19 if ('0'<=x[i]&&x[i]<='9') {t[k++]=x[i];} 20 if (x[i]=='-') 21 { 22 if (i==0) {t[k++]=x[i];continue;}////////// 23 if (x[i-1]=='-') {t[k++]=x[i];continue;}////////// 24 if (x[i-1]==x[i+1]-1) continue;//do nothing 25 if (x[i-1]>=x[i+1]) {t[k++]=x[i];continue;} 26 if ('a'<=x[i-1]&&x[i-1]<='z'&&'0'<=x[i+1]&&x[i+1]<='9') {t[k++]=x[i];continue;}//////// 27 if ('a'<=x[i+1]&&x[i+1]<='z'&&'0'<=x[i-1]&&x[i-1]<='9') {t[k++]=x[i];continue;}///////// 28 if (a==1) 29 { 30 j=0; 31 for (s=x[i-1]+1;s<x[i+1];s++) 32 for (w=0;w<b;w++) 33 temp[j++]=s; 34 } 35 if (a==2) 36 { 37 j=0; 38 if ('a'<=x[i-1]&&x[i-1]<='z') 39 for (s=x[i-1]+1;s<x[i+1];s++) 40 for (w=0;w<b;w++) 41 temp[j++]=s-'a'+'A'; 42 if ('0'<=x[i-1]&&x[i-1]<='9') 43 for (s=x[i-1]+1;s<x[i+1];s++) 44 for (w=0;w<b;w++) 45 temp[j++]=s; 46 } 47 if (a==3) 48 { 49 j=0; 50 for (s=x[i-1]+1;s<x[i+1];s++) 51 for (w=0;w<b;w++) 52 temp[j++]='*'; 53 } 54 if (c==1) 55 for (s=0;s<j;s++) 56 t[k++]=temp[s]; 57 if (c==2) 58 for (s=j-1;s>=0;s--) 59 t[k++]=temp[s]; 60 } 61 } 62 for (i=0;i<k;i++) 63 printf("%c",t[i]); 64 printf("\n"); 65 return 0; 66 }
其中加////////////的语句都是一开始没想到的。
That‘s all.