这几天做的北京的模拟,当时被这个题给卡住了,自己写的BFS,一直WA,结束后对拍才找到自己的致命错误

自己做的时候直接通过最优情况去推导最有情况,导致自己掉进死胡同了

这里举一个例子,比如变成01034

依次是,12345,12354,12534,12034,21034,31034,41034,51034,01034

可以见到这里的51034用了7步,而实际上51034最优策略是6步,这里为什么用7步的51034,而不用6步的51034呢?

是因为变成7步的51034,用了一次乘法,三次加法,变成6布的51034,用了两次乘法,三次加法,而变成01034,

需要一步乘法,可是6步的51034不能再使用乘法了

所以这个约束条件就导致了不能用最优的低步数答案去推到最优的高步数答案

这里的解决方法应该是把用了三次加法,一次乘法的51034和用了三次加法,两次乘法的51034分别记录下来

这里开一个数组ans[num][ins][dou],分别代表这个数,加法次数,乘法(乘二)次数

祈福 FREE LOOP 西安获得奖牌,加油!!!

附上改过之后AC的代码

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 10;
const int INF = 0x3f3f3f3f;
struct mynum
{int num;int tt;
};
struct sta
{string str;int time;int dou;int ins;
};
int ans[maxn][5][5];///[number][ins][dou]
void bfs(string str1, int time1, int dou1, int ins1)
{queue<sta> q;q.push(sta{str1, time1, dou1,ins1});while(!q.empty()){sta top = q.front();q.pop();int n = 0;int ten = 1;for(int i = 4; i >= 0; i--){n += (int)(top.str[i] - '0') * ten;ten = ten * 10;}if(ans[n][top.ins][top.dou] <= top.time)continue;ans[n][top.ins][top.dou] = min(ans[n][top.ins][top.dou], top.time);///  printf("n : %d : time : %d\n" ,n ,top.time);if(top.dou >= 1)///乘二{string tmp = top.str;for(int i = 0; i < 5; i++){int a = (int)(top.str[i] - '0');if(a == 0)continue;a = (a * 2) % 10;top.str[i] = a + '0';q.push(sta{top.str, top.time+1, top.dou-1, top.ins});top.str = tmp;}}for(int i = 0 ; i < 4; i++)///相邻交换{char c;string tmp = top.str;///  cout<<top.str<<"  ";c = top.str[i];if(top.str[i] == top.str[i+1])continue;top.str[i] = top.str[i+1];top.str[i+1] = c;///  cout<<top.str<<endl;q.push(sta{top.str, top.time + 1, top.dou, top.ins});top.str =tmp;}if(top.ins >= 1)///自增加一{string tmp = top.str;for(int i = 0; i < 5; i++){int a = (int)(top.str[i] - '0');a = (a + 1)% 10;top.str[i] = a + '0';/// cout<<str<<endl;q.push(sta{top.str, top.time+1, top.dou, top.ins-1});top.str = tmp;}}}
}
int main()
{/// freopen("2.out","w",stdout);memset(ans, INF, sizeof(ans));string sss = "12345";bfs(sss, 0, 2, 3);string myans;/// cout<< " total:" << cnt <<endl;/// for(int i = 0; i <cnt; i++) printf("%d %d\n", a[i].num, a[i].tt);while(cin>>myans){int n = 0;int ten = 1;//myans.length()-1for(int i = myans.length()-1; i >= 0; i--){n += (int)(myans[i] - '0') * ten;ten = ten * 10;}int freeloop = INF;for(int i = 0; i <= 3; i++){for(int j = 0; j <= 2; j++){freeloop = min(freeloop, ans[n][i][j]);}}if(freeloop == INF){printf("-1\n");}else{printf("%d\n", freeloop);}///  n++;}return 0;
}

2016北京区域赛E UVAlive 7672 题目:What a Ridiculous Election 带约束条件的BFS相关推荐

  1. (2015)北京区域赛总结+回忆录

    从去年7月跟着学长们入坑,到今年11月去北京比赛,一年多的时间就这样转眼度过,现在坐在电脑面前码字时大脑却一片空白,不知道从何说起.想起去年暑假的时候,每天都是8点多到实验室晚上10点回宿舍,顿顿和学 ...

  2. acm2015北京区域赛游记

    一只完全由大二组成的队伍第一次参加区域赛,最后压铜尾,这可能是上大学后做过最刺激的事情了.. 不像许多其他的大神,,接触算法时间太晚了,都是大一才开始学C语言,跟大部分oi大爷比起来差太远了→_→ → ...

  3. 星辰天合获得鲲鹏应用创新大赛 2022 北京区域赛决赛一等奖

    2022 年 8 月 30 日,以 "数智未来,因你而来" 为主题的统信创客北京・鲲鹏应用创新大赛 2022 北京区域决赛于北京鲲鹏联合创新中心成功举办,XSKY星辰天合团队的参选 ...

  4. 2016 杭州区域赛补题

    A - ArcSoft's Office Rearrangement HDU - 5933 题意:现在有n个办公区,每个办公区内有a[i]个办公人员,现在要将这些人均匀的分布在m个办公区内,每个办公区 ...

  5. 2017 ACM-ICPC 北京区域赛记录

    ------------------------------------------------------------------------------ 出发日 拖着一个大箱子走是真的累. 下午三 ...

  6. Hdu 4090 GemAnd Prince (搜索_2010年北京区域赛)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4090 题目大意:给定一个n*m,矩阵上每个点都有一个数字,数字范围是1到k,某个数字相同的连通块如果 ...

  7. 【区域赛总结】2015ACM-ICPC北京区域赛

    not the end,why the end? 总结: 1.中档难度题目突破较少,后面要集中做一些中档难度的题目 2.多打比赛,bc.cf等,专题理论训练+实战

  8. 2018北京区域赛总结

    因为这次北京之行要花费四五天,临行前,我将所有课程的作业都做完了,甚至连回来要上的课的都提前准备了.万万没想到,jsp老师突然说要期中考,这令我心中有些烦躁,有点担心学业会被这次比赛搞砸.犹豫了一下, ...

  9. 2015北京区域赛 Mysterious Antiques in Sackler Museum 几何基础+思维

    题意是,选出三个,看看是否可以凑成一个新的矩形. #include<bits/stdc++.h> using namespace std; struct node { int cnt[2] ...

最新文章

  1. Google、Facebook、亚马逊、Uber等硅谷顶尖AI专家团北京聚首 ,这场AI开发者盛会不可错过
  2. Science:基于微生物条形码系统的高分辨率物源追踪技术
  3. 如何理解“跳出率”,它对SEO有什么影响?
  4. ARM启动代码中_main 与用户主程序main()的区别
  5. Http协议中的数据传送之多重表单提交--multipart/form-data
  6. 使用myeclipse创建带注解的model实体类
  7. JVM之方法区Mothed Area
  8. 7-6 0-1背包 (20 分)(思路加详解+网格做法+动态规划)Come Baby !!!!!!!!!!!!!!
  9. vue v-if判断数组元素的值_Vue项目上线做的一些基本优化
  10. 【2018开年知识盛会】15位大咖直播分享,全方位解析NoSQL数据库
  11. electron 前端开发桌面应用
  12. 小红旗图标在excel如何输入_excel数据核对技巧:如何用函数公式标识输入正误...
  13. Requests API
  14. 作为刚開始学习的人应该怎样来学习FPGA
  15. 谨防企业管理者察人不慎,满盘皆输
  16. c#控件弹幕效果_求C#弹幕游戏弹幕的代码
  17. 利用三轴加速器的计步测算方法
  18. 实用机器学习-学习笔记
  19. 【Eclipse AST】AST与ASTView简介
  20. Java实现凑硬币或者最少硬币数

热门文章

  1. 【微服务】网站安全认证架构演进
  2. Android系统10 RK3399 init进程启动(三十四) 常见Property属性
  3. html元素的 height、clientHeight和offsetHeight之间的区别
  4. JAVA编写一个telephone_1、 编写一个Java程序,程序中有一个类Telephone, Telephone类中包括有电话品牌、...
  5. 组装超级计算机需要什么知识,Microwulf我们平常人也能组装的超级计算机
  6. 计算机英语第二版司爱侠翻译,计算机英语 第2版 配套习题 司爱侠 张强华 参考试卷.pdf...
  7. WinAPI: GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId
  8. Go pprof和火焰图
  9. C# ActiveX控件开发
  10. 测试过程--编写测试用例