Noip2009的题目还是有一定难度的,主要是搜索和最短路都是我的弱项,不检查第一遍下来只做了150分,还是这句话,素质和读题的仔细程度决定了分数。仔细想想,我们化学老师说的话没错,或许题目你都会做,但是你在考试时犯下的各种错误终将导致你的失败,所以,提高个人编程的素质,对于我来说才是目前最重要的事。

T1:潜伏者

  第一题是极简单的字符串操作题,读题仔细一点,注意各种规则即可AC,但是在做的时候自己犯了一点小错误,结果只有90分,这是不应该的!

  1. #include <cstdio>
  2. #include <cstring>
  3. char s1[105],s2[105],w[105];
  4. int hash[26],flag[26],ap[26];
  5. int main(){
  6. scanf("%s",s1); scanf("%s",s2);
  7. for(int i=0;i<strlen(s1);i++){
  8. if(ap[s1[i]-'A']==1&&hash[s1[i]-'A']!=s2[i]-'A'){puts("Failed");return 0;}
  9. ap[s1[i]-'A']=1;
  10. hash[s1[i]-'A']=s2[i]-'A';
  11. }
  12. for(int i=0;i<26;i++)if(!ap[i]){puts("Failed");return 0;}
  13. for(int i=0;i<26;i++){
  14. if(flag[hash[i]]){puts("Failed");return 0;}
  15. flag[hash[i]]=1;
  16. }
  17. scanf("%s",w);
  18. for(int i=0;i<strlen(w);i++)printf("%c",(char)(hash[w[i]-'A']+(int)'A'));
  19. return 0;
  20. }

T2:Hankson的趣味题  

  第一遍用暴力,拿了六十分,看了网上的题解,需要素数分解,然后是一些比较复杂的范围求解,个人感觉没必要,然后尝试了一下只枚举sqrt(n),且判断是否是约数,如果是进行一次计算,并计算其对应的相乘为n的数是否成立,否则continue,然后神奇般地AC了,所以有时候没必要想得太过复杂,认真思考,或许最简单的方法才是最有效的。

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. void init(int &x){
  6. char c;
  7. while(c=getchar(),c<'0'||c>'9'); x=c-'0';
  8. while(c=getchar(),c>='0'&&c<='9')x=x*10+c-'0';
  9. }
  10. int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
  11. int lcm(int x,int y){return x/gcd(x,y)*y;}
  12. int main(){
  13. int T,a0,a1,b0,b1;
  14. scanf("%d",&T);
  15. while(T--){
  16. int cnt=0;
  17. init(a0);init(a1);init(b0);init(b1);
  18. int k=sqrt(b1);
  19. for(int i=1;i<=k;i++){
  20. if(b1%i!=0)continue;
  21. if(gcd(i,a0)==a1&&lcm(i,b0)==b1)cnt++;
  22. int tmp=b1/i;
  23. if(tmp!=i&&gcd(tmp,a0)==a1&&lcm(tmp,b0)==b1)cnt++;
  24. }
  25. printf("%d\n",cnt);
  26. }
  27. return 0;
  28. }

T3:最优贸易  

  想得过于复杂,结果码不出程序,暴力拿了0分,汀神说最短路就好啦,然后醒悟,正向建图SPFA一遍求到某点路上的最小值,反向建图同理求得从终点到此处的最大值,然后枚举每一个点进行计算比较一下即可。

  1. #include <cstdio>
  2. #define Q_MAX 100000
  3. int m1[1000005],next1[1000005],end1,head1[100005];
  4. int m2[1000005],next2[1000005],end2,head2[100005];
  5. int num[100005],used[100005],Q[Q_MAX],h,r;
  6. int min[100005],max[100005];
  7. void add1(int a,int b){m1[end1]=b;next1[end1]=head1[a];head1[a]=end1++;}
  8. void add2(int a,int b){m2[end2]=b;next2[end2]=head2[a];head2[a]=end2++;}
  9. void Q_push(int k){
  10. if(used[k]){return;}
  11. used[k]=1; Q[r]=k;
  12. r=(r+1)%Q_MAX;
  13. }
  14. int Q_pop(void){
  15. int t=Q[h];
  16. used[t]=0;
  17. h=(h+1)%Q_MAX;
  18. return t;
  19. }
  20. int main(){
  21. int i,j,n,m,a,b,c;
  22. scanf("%d%d",&n,&m);
  23. for(i=0;i<n;i++){
  24. head1[i]=head2[i]=-1;
  25. max[i]=-1000000;
  26. min[i]=1000000;
  27. scanf("%d",&num[i]);
  28. }
  29. for(i=0;i<m;i++){
  30. scanf("%d%d%d",&a,&b,&c);
  31. a--,b--;
  32. if(c==2){
  33. add1(a,b); add1(b,a);
  34. add2(a,b); add2(b,a);
  35. }else add1(a,b),add2(b,a);
  36. }
  37. min[0]=num[0];
  38. Q_push(0);
  39. while(h!=r){
  40. i=Q_pop();
  41. for(a=head1[i];a!=-1;a=next1[a]){
  42. j=m1[a];
  43. if(min[j]>min[i])min[j]=min[i],Q_push(j);
  44. if(min[j]>num[j])min[j]=num[j],Q_push(j);
  45. }
  46. }
  47. max[n-1]=num[n-1];
  48. Q_push(n-1);
  49. while(h!=r){
  50. i=Q_pop();
  51. for(a=head2[i];a!=-1;a=next2[a]){
  52. j=m2[a];
  53. if(max[j]<max[i])max[j]=max[i],Q_push(j);
  54. if(max[j]<num[j])max[j]=num[j],Q_push(j);
  55. }
  56. }
  57. for(i=a=0;i<n;i++)if(a<max[i]-min[i])a=max[i]-min[i];
  58. printf("%d\n",a);
  59. return 0;
  60. }

T4:靶形数独  

   这道题的搜索很巧妙,如果直接搜索判重过于复杂而且会超时,想想八皇后的位运算搜索方法,应用在这道题上刚好,而且简化许多,用hs,ss表示横排,竖排上已有的数字,用nine表示每个小方格中已有的数字,而h表示该处是否被占据,然后就用lowbit计算低位空,依次进行dfs,每当k=10即搜索完成时更新最大值即可。

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. int a[10][10],h[10],hs[10],ss[10],nine[10],hash[10],q[10],ans=-1,st=511;
  7. int ten(int x){return (int)log2(x)+1;}
  8. void f(){
  9. int c=a[5][5]*10;
  10. for(int k=2;k<=5;k++){
  11. for(int i=k;i<=10-k;i++)c+=(4+k)*(a[i][k-1]+a[i][11-k]);
  12. for(int j=k;j<=10-k;j++)c+=(4+k)*(a[k-1][j]+a[11-k][j]);
  13. c+=(4+k)*(a[k-1][k-1]+a[k-1][11-k]+a[11-k][k-1]+a[11-k][11-k]);
  14. }
  15. if(c>ans)ans=c;
  16. }
  17. void dfs(int k){
  18. if(k==10)f();
  19. else{
  20. int i=hash[k],j,get,num,pos,p;
  21. pos=st&~h[i]; p=pos&-pos;
  22. h[i]|=p; j=ten(p);
  23. get=st&~(hs[i]|ss[j]|nine[(i-1)/3*3+(j-1)/3+1]);
  24. while(get){
  25. num=get&-get;
  26. get^=num;
  27. a[i][j]=ten(num);
  28. hs[i]|=num; ss[j]|=num;
  29. nine[(i-1)/3*3+(j-1)/3+1]|=num;
  30. if(pos==p)dfs(k+1); else dfs(k);
  31. hs[i]^=num; ss[j]^=num;
  32. nine[(i-1)/3*3+(j-1)/3+1]^=num;
  33. }h[i]^=p;
  34. }
  35. }
  36. int main(){
  37. int k=1;
  38. for(int i=1;i<=9;i++)
  39. for(int j=1;j<=9;j++){
  40. hash[i]=i;
  41. scanf("%d",&a[i][j]);
  42. if(a[i][j]){
  43. h[i]|=1<<(j-1);
  44. if(((hs[i]|ss[j]|nine[(i-1)/3*3+(j-1)/3+1])&(1<<(a[i][j]-1)))==1){printf("-1\n");return 0;}
  45. hs[i]|=1<<(a[i][j]-1);
  46. ss[j]|=1<<(a[i][j]-1);
  47. nine[(i-1)/3*3+(j-1)/3+1]|=1<<(a[i][j]-1);
  48. }else q[i]++;
  49. }
  50. for(int i=1;i<9;i++)for(int j=i+1;j<=9;j++)
  51. if(q[hash[i]]>q[hash[j]])swap(hash[i],hash[j]);
  52. while(q[hash[k]]==0)k++;dfs(k);
  53. printf("%d\n",ans);
  54. return 0;
  55. }

注意点:

  1.最短路的几种算法都要熟悉起来,并且要可以很快码出来;

  2.对于位置搜索优化时可以考虑位运算;

3.读题一定要清楚仔细,宁愿多花几分钟,也不要因读错题走冤枉路;

  4.循环队列记得进队出队都要取模。

Noip2009提高组总结的更多相关文章

  1. 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)

    传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...

  2. [NOIP2009] 提高组 洛谷P1073 最优贸易

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...

  3. [NOIP2009] 提高组 洛谷P1071 潜伏者

    题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...

  4. [NOIP2009] 提高组 洛谷P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  5. [NOIP2009] 提高组 洛谷P1072 Hankson 的趣味题

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  6. noip2009提高组解题报告

    NOIP2009潜伏者 题目描述 R 国和S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历尽艰险后,潜伏于 S 国的R 国间谍小C 终于摸清了S 国军用密码的编码规则: 1. S 国 ...

  7. noip2009提高组题解

    NOIP2009题解 T1:潜伏者 题目大意:给出一段密文和破译后的明文,一个字母对应一个密文字母,要求破译一段密文,如果有矛盾或有未出现密文无法破译输出failed,否则输出明文. 思路:纯模拟题 ...

  8. NOIP2009 提高组T3 机器翻译 解题报告-S.B.S

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...

  9. 【NOIP2009提高组】最优贸易

    https://www.luogu.org/problem/show?pid=1073 如果他想在i点卖出,那么就要在从1点出发到i点的路径里找个最便宜的买入,用Bellman-Ford求出这样最便宜 ...

随机推荐

  1. BZOJ 3774: 最优选择( 最小割 )

    最小割...二分染色然后把颜色不同的点的源汇反过来..然后就可以做了. 某个点(x,y): S->Id(x,y)(回报), Id(x,y)->T(代价), Id(i,j)&& ...

  2. Analysis about different methods for reading and writing file in Java language

    referee:Java Programming Tutorial Advanced Input & Output (I/O) JDK 1.4+ introduced the so-calle ...

  3. 1 2 5 10 20 --> 800

    用1元 2元 5元 10元 20元的钞票凑成800元的方法种数计算,使用了动态规划. 结果没打出来,只是保留在函数里各个vector中,调试可看所有结果. 优点:快 缺点:占空间占内存 耗时时间测试: ...

  4. Linux 网络编程基础(3) -- 数据的IO

    首先介绍两个数据结构及相关的操作函数:struct iovec.struct msghdr struct iovec { void * iov_base;    /*向量的缓冲地址*/ size_t ...

  5. protel99与win7兼容问题的解决方案

    一些用户大概都已经把自己的 PC 从 winXP 换到了 win7,在 win7 给我们带来的视觉上的冲击和功能上的更换.也不时的带来了各方面的软件兼容问题 ,而一般上的兼容都可以在 win7 的自动 ...

  6. SSD的来由与优势

           SSD,对于很多人来说,它现在已不再是个很陌生的名词,有些网友谐趣的把它称作“湿湿的”,这里既有谐音的意味,也有称赞SSD意思.虽然大家对SSD已不算陌生,但恐怕对SSD的历史也所知不多 ...

  7. Jsoup代码解读之三-Document的输出

    Jsoup代码解读之三-Document的输出   Jsoup官方说明里,一个重要的功能就是output tidy HTML.这里我们看看Jsoup是如何输出HTML的. HTML相关知识 分析代码前 ...

  8. MyEclipse13中修改Servlet.java源代码

    Servlet.java源代码想要修改的步骤,与低版本的不同废话少说,直接来步骤: 1,在myEclipse的安装目录中搜索com.genuitec.eclipse.wizards文件,如图:选择co ...

  9. [ACM] POJ 2253 Frogger (最短路径变形,每条通路中的最长边的最小值)

    Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24879   Accepted: 8076 Descript ...

  10. xcode initWithCoder\awakeFromNib\layoutSubviews

    控件通过xib,storyboard创建,初始化设置一定会调用initWithCoder awakeFromNib 加载完毕的时候肯定会调用 layoutSubviews 布局子控件 位置和尺寸 利用 ...