数组

Master-Mind Hints,Uva 340

题目:给定答案序列和用户猜的序列,统计有多少数字对应正确(A),有多少数字在两个序列都出现过但位置不对。
输入包括多组数据。每组输入第一行为序列长度n,第二行是答案序列,接下来是若干猜测序列。猜测序列为0时改组数据结束。n=0时输入结束。

样例输入:
4
1 3 5 5
4 3 3 5
6 5 5 1
6 1 3 5
1 3 5 5
0 0 0 0
10
1 2 2 2 4 5 6 6 6 9
1 2 3 4 5 6 7 8 9 1
1 1 2 2 3 3 4 4 5 5
1 2 1 3 1 5 1 6 1 9
1 2 2 5 5 5 6 6 6 7
0 0 0 0 0 0 0 0 0 0
0

样例输出:
Game 1:
(1,1)
(2,0)
(1,2)
(1,2)
(4,0)
Game 2:
(2,4)
(3,2)
(5,0)
(7,0)

我的思路:
这里贴一段错误的代码;思路看起来是对的,但是实现和Debug过程过于麻烦,远远不及书上的思路。不必细究。

#include<stdio.h>
int main()
{struct p{int a;int b;//b stand for status used/unused}b[105];int n,i,j,t=0,m=0,a[105],k=0;while(scanf("%d",&n)!=EOF && n!=0){for(i=1;i<=n;i++)b[i].b=0;//setstatus "0"for(i=1;i<=n;i++)scanf("%d",&a[i]);for(k=1;;k++){scanf("%d",&b[1].a);if(b[1].a==0)break;//scanf 0else{for(i=2;i<=n;i++)scanf("%d",&b[i].a); }for(i=1;i<=n;i++)//comparing a[i] and b[j].a {for(j=1;j<=n;j++){if(a[i]==b[j].a && j==i){t++;if(b[j].b==1)m--;/*for(k=1;k<=j;k++){if(b[k].a==a[i] && b[k].b==1){m--;b[k].b=0;}}*/b[j].b=1;break;}if(a[i]==b[j].a && i!=j && b[j].b==0){//if(b[j-1].b==2)break;m++;b[j].b=1;break;}} }printf("Game %d: (%d,%d)\n",k,t,m);t=0;m=0;for(i=1;i<=n;i++)b[i].b=0;}}return 0;
}//6 5 5 3
//1 2 2 5 5 5 6 6 6 7

这大概是我至今最失败的几次编程之一了,我定义一个结构体数组b,b[i].a存储用户输入的数,b[i].b存储这个数的状态,如果它被调用则置1,如果被错误调用(即本来是与答案序列正确对应的,但被程序视作不对应从而使m++)置0,同时t++,m--。读者大概也能够猜出我的想法:用循环嵌套循环来寻找位置相同和不相同的数从而获取A和B的个数。

在经过几个小时的不断重复的过程中,我发现耗费在这上面的时间过多,而每一次尝试都无功而返。

不禁让我反思自己的问题,在我之前的编程中,解决问题的算法经常出现一些严重的漏洞,使我不得不去重新思考这个方法的框架,耗费的时间以小时计。别人十几分钟就可以解决的问题我会花上两三个小时。
重新思索其他的解题方法也许是一个不错的解决方法,但是我能不能找到它,并且效率是否会高,这还需我自己用时间来检验。

回到此题,可能是最简单的算法:直接统计A,为了计算B,对每个数字(0-9),统计二者出现的次数c1,c2,那么min(c1,c2)就是该数字对B的贡献。最后要减去A的部分。
代码(大体部分):

#include<stdio.h>
int main()
{int n,i,j,c1=0,c2=0,m=0,t=0;int a[1005],b[1005];scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i]);}for(i=1;i<=n;i++){scanf("%d",&b[i]);if(b[i]==a[i])t++;//查找正确的位}for(i=1;i<=9;i++)//遍历1-9{for(j=1;j<=n;j++){if(a[j]==i)c1++;//出现在a[i]中的个数 if(b[j]==i)c2++;//出现在b[i]中的个数 }if(c1>c2)m+=c2;else m+=c1;//m+=min(c1,c2)c1=0;c2=0;}printf("Game:(%d,%d)",t,m-t);//计算错位:m-treturn 0;
}
                                                                                                2016/3/9

转载于:https://www.cnblogs.com/qq952693358/p/5257432.html

《算法竞赛入门经典》习题及反思 -2相关推荐

  1. 算法竞赛入门经典 习题3-2 分子量 Molar Mass

    给出一种物质的分子式(不带括号),求其分子量.本题分子式中只包含四种原子,分别为C.H.O.N,原子量分别为12.01,1.008,16.00,14.01.例如,C6H5OH的分子量为94.108g/ ...

  2. 算法竞赛入门经典|习题3-8, 循环小数(UVa202)

    耗时:1小时22分. 储备知识: 1.循环节 如果无限小数点后,从某一位起向右进行到某一位止的数字循环出现,首位衔接,则称这个小数为循环小数,这段数字为循环节. 例如: 547/7 = 78.(142 ...

  3. UVa 220 黑白棋 算法竞赛入门经典 习题4-3

    输出格式输出格式输出格式!UVaOJ的输出控制让我想起了玩黑魂时的感觉. 这道题难点在M操作后的输出 "Black - " 一眼看去'-'后面是两个个空格,然而事实是-与后面的数字 ...

  4. 算法竞赛入门经典 习题6-14

    UVa12118 Inspector's Dilemma 每两个城市之间都有道路连通,检查员要通过指定的道路,途中可以经过其它未指定的道路.通过每条道路的时间是一样的,求出通过所有指定道路要花费的最小 ...

  5. 算法竞赛入门经典 习题6-12

    UVa810 A Dicey Problem 一个迷宫里有一骰子,骰子可以上下左右移动的条件是相邻格中的数字和骰子朝上面的数字相同,或者相邻格子中为*.求一条从起点出发,最终回到起点的路径. 深搜和广 ...

  6. 算法竞赛入门经典(第二版)第三章习题

    声明:作者水平有限,只是会基础C语言的小菜,C++还未入门.作者仅根据算法竞赛入门经典(第二版)书上第三章习题所述题意而编写,并未严格按照原题的输入输出编写,代码仅经过个人测试(OJ网站太慢了).代码 ...

  7. 刘汝佳《算法竞赛入门经典(第二版)》习题(三)

    刘汝佳<算法竞赛入门经典(第二版)>第三章习题(一) 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分.每个 ...

  8. 刘汝佳《算法竞赛入门经典(第二版)》习题(六)

    刘汝佳<算法竞赛入门经典(第二版)>第四章习题(4-1~4-3) 习题4-1 象棋(Xiangai,ACM/ICPC Fuzhou 2011,UVa1589) 考虑一个象棋残局,其中红方有 ...

  9. 刘汝佳《算法竞赛入门经典(第二版)》习题(二)

    刘汝佳<算法竞赛入门经典(第二版)>第二章习题 目录 刘汝佳<算法竞赛入门经典(第二版)>第二章习题 习题2-1 水仙花数 习题2-2 韩信点兵 习题2-3 倒三角形 习题2- ...

  10. 算法竞赛入门经典(第二版)-刘汝佳-第六章 数据结构基础 习题(12/14)

    文章目录 说明 习题 习6-1 UVA 673 平衡的括号 习6-2 UVA 712 S - 树 习6-3 UVA 536 二叉树重建 习6-4 UVA 439 骑士的移动 习6-5 UVA 1600 ...

最新文章

  1. 使用Windbg调试StackOverflowException异常
  2. java8 list 行转列_Java14 都来了,你还不会用 Java8吗?
  3. java游戏应龙女魃转世_应龙和女魃的凄美爱情,究竟是爱情,还是阴谋?
  4. css如何调整红心样式_CSS3跳动的红心
  5. 中常用的函数_ST语言编程中常用的函数/功能块
  6. 脱离标准文档流(1)---浮动
  7. OpenCV-闭运算(CLOSE)
  8. Altium Designer 17 安装破解版详细教程
  9. Textbox的用法
  10. 宏基aspire拆机触摸_Acer宏基E1471G笔记本怎么拆机拆主板?
  11. 有限元分析的基本知识 (一份培训资料) (1)
  12. LP-630K打印机无法插入放发票或纸张,只要一碰到就发出滴滴滴滴的声音的解决方法
  13. 更改分类算法的阙值的资料
  14. WPS 中添加MathType插件
  15. Win7的2020年1月补丁下载及打补丁方法
  16. Springboot注解@ServletComponentScan和@ComponentScan
  17. 最值得珍藏的420个生活小窍门
  18. JZOJ【入门】1290 行李托运费
  19. 三星复仇计划开始:苹果一出LTE设备就要起诉它!
  20. 使用快捷键打开当前目录iTerm

热门文章

  1. 微软百名员工公开请愿,力挺“996.ICU”
  2. 致运维——运维军团告诉你如何走过七年之痒
  3. 给你看一下真实的后浪...
  4. 这才是真正的薪资水平
  5. 我也不知道取什么标题好了!
  6. Activity/Fragment最强生命周期总结
  7. 学python编程_程序员学Python编程或许不知的十大提升工具
  8. java.lang.ClassNotFoundException: javax.servlet.SessionCookieConfig
  9. Javascript 第五章总结:A trip to Objectville
  10. leecode 树是否是平衡树 java