测试总结(没有rank1)
一个初三蒟蒻不可能rank1.jpg
T1:
给出两个单词 (开始单词和结束单词) 以及一个词典。 找出从开始单词转换到结束单词,
所需要的最短转换序列。转换的规则如下:
1、每次只能改变一个字母
2、转换过程中出现的单词(除开始单词和结束单词)必须存在于词典中
例如:
开始单词为:hit
结束单词为:cog
词典为:[hot,dot,dog,lot,log,mot]
那么一种可能的最短变换是: hit -> hot -> dot -> dog -> cog,
所以返回的结果是序列的长度 5;
注意:
1、如果不能找到这种变换,则输出 0;
2、词典中所有单词长度一样;
3、所有的单词都由小写字母构成;
4、开始单词和结束单词可以不在词典中。
每个词长度不大于5,词数不超过30
看上去好难...要各种比较字符串,判断变化...
然而这是一道搜索题(看数据范围)
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<stdio.h> using namespace std; char tar[6]; //目标字符串 char sta[6]; //初始字符串 char index[35][6]; //字典 int l; //字符串长度 int minn=35; //答案,最终要取最小,设一个怎么都算不到的极大值, int t=1; //处理读入的指针(并不是*指针) bool used[35]; //查看在搜索时是否用过,毕竟一个词不能用两遍,也用不了两遍... inline void search(int step,char a[6]){ //用这两个变量step传递步数状态,a数组传递目前字符状态 int sum=0; for(int i=0;i<l;i++) if(a[i]!=tar[i]) sum++; //比较a数组与tar是否只有一步之遥 if(sum==1) minn=min(minn,step); for(int i=1;i<=t;i++){ if(used[i])continue; sum=0; int p; //保存与a不同的字符下标方便深搜回溯 char c; //保存原先的a的被替换字符以便回溯 for(int j=0;j<l;j++){ if(a[j]!=index[i][j]) sum++,p=j; } if(sum==1){ c=a[p]; a[p]=index[i][p]; used[i]=1; search(step+1,a); a[p]=c; //反悔操作 used[i]=0; } } } int main(){ //freopen("word.in","r",stdin); scanf("%s",sta); scanf("%s",tar); l=strlen(sta); while(scanf("%s",index[t])!=EOF) //输入处理,之前面对这种无限制输入很头疼 t++; search(2,sta); if(minn!=35) printf("%d\n",minn); else printf("0\n"); //无解的特判 return 0; }
总而言之,一个1h10min的搜索题
T2
对于 n=4 时,对应的集合 s={4,3,2,1},他的非空子集有 15 个
当 n=4 时,集合{4,3,2,1}的 15 个子集分别对应于 4 位二进制数:
{1}:0001;{2}:0010;{1,2}:0011;{3}:0100,…,{1,2,3,4}:1111。
把二进制数相对应的十进制数的 1,2,3,…,15 分别作为相应集合的编号。
如子集{1,2,4}对应的二进制数是 1011,相应的十进制数是 11,所以子集{1,2,4}的编号
为 11。
任务:
对于给定的 n 和 m,输出集合{1,2,…,n}的编号为 m 的子集。
思路是状态压缩dp的核心
本题的n没有任何用处,仅是对m的数位分析,
主要算法思路就是把m的二进制展开,某一位为1则输出该数,为0则表示没有该数,不输出
一道大水题
代码:
#include<iostream> #include<cstdio> using namespace std; int n,m; int main(){ scanf("%d%d",&n,&m); n=1; while(m){ if(m&1)printf("%d ",n); n++; m>>=1; }return 0; }
快速幂处理方法不解释
T3(毒瘤,不给大样例,没有小数据,1分都没骗到...):
有 n 个城市,编号 1~n。其中 i 号城市的繁华度为 pi。省内有 m条可以双向同行的高速
公路,编号 1~m。编号为 j 的高速公路连接编号为 aj 和 bj 两个城市,经过高速公路的费用
是 wj。若从城市 x 出发到某城市 y,除了需要缴纳高速公路费用,还要缴纳“城市建设费”
(为从 x 城市到 y 城市所经过的所有城市中繁华度的最大值,包括 x 和 y 在内)。
现提出 q 个询问,每个询问给出一组 x 和 y,你需要回答从 x 出发到 y 城市,所需要的
最低交通费(高速公路费+城市建设费)是多少。
刚刚测试时代码蜜汁不见了先把代码粘上来:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int dis[255][255]; int pm[255][255]; int p[255]; int n,m,q; int main(){ //freopen("road.in","r",stdin); //freopen("road.out","w",stdout); memset(dis,0x3f,sizeof dis); scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=n;i++) scanf("%d",&p[i]); for(int i=1;i<=m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); dis[a][b]=min(dis[a][b],c); dis[b][a]=min(dis[a][b],c); pm[a][b]=max(p[a],p[b]); pm[b][a]=max(p[a],p[b]); } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(dis[i][j]+pm[i][j]>dis[i][k]+dis[k][j]+max(pm[i][k],pm[k][j])){ dis[i][j]=dis[i][k]+dis[k][j]; pm[i][j]=max(pm[i][k],pm[k][j]); } } } } while(q){ q--; int x,y; scanf("%d%d",&x,&y); printf("%d\n",dis[x][y]+pm[x][y]); }return 0; }
这是10分代码...然而当时我并没有10分(当时没有判重边)
标程:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; int n,m,q,p[300],aj,bj,wj,x,y,f[300][300],a[300][300],top,t[300]; int cmp(int x,int y) { return p[x]<p[y]; } int main() { freopen("road.in","r",stdin); freopen("road.out","w",stdout); memset(a,63,sizeof(a)); top=0; scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=n;i++) scanf("%d",&p[i]); for(int i=1;i<=m;i++) { scanf("%d%d%d",&aj,&bj,&wj); a[aj][bj]=min(a[aj][bj],wj); a[bj][aj]=min(a[bj][aj],wj); } for(int i=1;i<=n;i++) { a[i][i]=0; t[i]=i; } sort(t+1,t+1+n,cmp); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=a[i][j]+max(p[i],p[j]); for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { a[i][j]=min(a[i][j],a[i][t[k]]+a[t[k]][j]); f[i][j]=min(f[i][j],a[i][j]+max(p[i],max(p[j],p[t[k]]))); } for(int i=1;i<=q;i++) { scanf("%d%d",&x,&y); printf("%d\n",f[x][y]); } fclose(stdin); fclose(stdout); return 0; }
现将价值排序,再进行Floyd
原文地址:https://www.cnblogs.com/648-233/p/11010681.html
- SQL注入攻防入门详解
- jQuery插件编写步骤详解
- 深入探秘Neutron API
- 碎片化 | 第七阶段-10-session共享解决方案-视频
- CSS选择器是如何确定优先级的?
- JS中控制好this关键字的指向
- 碎片化 | 第四阶段-46-值栈valueStack介绍和原理-视频
- Laravel中运行Gulp任务的利器(一) —— Laravel Elixir简介及入门教程
- 碎片化 | 第四阶段-52-Hibernate特性-视频
- 碎片化 | 第四阶段-53-hibernate持久化session问题解决-视频
- 入门webpack(下)
- 巨头们关注的实时Web:发展与相关技术
- 碎片化 | 第四阶段-54-hibernate-spring整合流程-视频
- OpenDaylight Lithium版本简单应用及流表操作指南
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 虚拟机字节码执行引擎,JVM的马达图,是爱情呀
- 微信小程序【浅提WXSS样式】
- Kubernetes Liveness and Readiness Probes
- Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库
- pytest文档59-运行未提交git的用例(pytest-picked)
- pytest文档57-单元测试代码覆盖率(pytest-cov)
- pytest文档58-随机执行测试用例(pytest-random-order)
- Kubernetes探针踩坑记
- 大揭秘| 我司项目组Gitlab Flow && DevOps流程
- 离线安装Superset 0.37(截图详细版)
- 如何高速转储、索引和第7层网络流量过滤?
- 爬虫 | JS逆向某验滑动加密(二)
- 闲聊 Kotlin-Native (0) - 我们为什么应该关注一下 Kotlin Native?
- 哈佛大学单细胞课程|笔记汇总 (五)
- 通过源码理解IGMP v1的实现(基于linux1.2.13)