记录编号 58868 评测结果 AAAAAAAAAA
题目名称 [HAOI 2013]遥控器 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2013-04-28 21:43:13 内存使用 0.32 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<iomanip>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<cstring>
  7. #include<deque>
  8. #include<fstream>
  9. using namespace std;
  10. int INF=999999;
  11. int X,Y;
  12. int up,down,ext;//上键,下键,扩展键
  13. int num[15]={0};//每个数字键是否能输入
  14. bool able[125]={0};//每个台号是否可直接输入
  15. int numcost[125]={0};//从X台直接输入每个台号的代价
  16. int ans=INF;
  17. void read(void){
  18. scanf("%d%d%d",&num[1],&num[2],&num[3]);
  19. scanf("%d",&up);
  20. scanf("%d%d%d",&num[4],&num[5],&num[6]);
  21. scanf("%d",&down);
  22. scanf("%d%d%d",&num[7],&num[8],&num[9]);
  23. scanf("%d",&ext);
  24. scanf("%d",&num[0]);
  25. scanf("%d%d",&X,&Y);
  26. }
  27. void extend_1(void){
  28. int i;
  29. for(i=0;i<=9;i++) able[i]=num[i],numcost[i]=1;
  30. }
  31. void extend_2(void){
  32. if(!ext) return;//不可行
  33. int i,j;
  34. for(i=1;i<=9;i++){
  35. if(num[i]){
  36. for(j=0;j<=9;j++){
  37. if(num[j]){
  38. able[i*10+j]=true;
  39. numcost[i*10+j]=3;//按三次
  40. }
  41. }
  42. }
  43. }
  44. }
  45. int dis_up(int a,int b){//从a"上键"到b的代价
  46. if(b>=a){
  47. return b-a;
  48. }
  49. else return 100+b-a;
  50. }
  51. int dis_down(int a,int b){//从a"下键"到b的代价
  52. if(b<=a) return a-b;
  53. else return 100+a-b;
  54. }
  55. void try_num(void){//是否能直接输入Y
  56. if(able[Y]){
  57. if(numcost[Y]<ans) ans=numcost[Y];
  58. }
  59. }
  60. void try_up(void){//试着"++"到Y
  61. if(!up) return;
  62. int i;
  63. int temp;
  64. for(i=0;i<=99;i++){
  65. if(able[i]){
  66. temp=numcost[i]+dis_up(i,Y);
  67. if(temp<ans) ans=temp;
  68. }
  69. }
  70. }
  71. void try_down(void){//试着"--"到Y
  72. if(!down) return;
  73. int i,temp;
  74. for(i=0;i<=99;i++){
  75. if(able[i]){
  76. temp=numcost[i]+dis_down(i,Y);
  77. if(temp<ans) ans=temp;
  78. }
  79. }
  80. }
  81. int main(){
  82. freopen("HAOI2013T5.in","r",stdin);
  83. freopen("HAOI2013T5.out","w",stdout);
  84. read();
  85. extend_1();
  86. extend_2();
  87. able[X]=true,numcost[X]=0;//直接可达
  88. try_num();
  89. try_up();
  90. try_down();
  91. if(ans==INF) printf("-1\n");
  92. else printf("%d\n",ans);
  93. return 0;
  94. }