南京理工机试试题详解

南京某理工类高校机试题

 

并查集+kruskal+坐标处理

 1 const int MAXN=110;//最大点数
 2 const int MAXM=100005;//最大边数
 3 int F[MAXN];//并查集使用
 4 struct Node {
 5     int x;
 6     int y;
 7 } Point[1000];
 8 struct Edge {
 9     int u,v;
10     double w;
11 } edge[MAXM]; //存储边的信息,包括起点/终点/权值
12 int tol;//边数,加边前赋值为0
13 void addedge(int u,int v,double w) { //邻接矩阵的优化结构,kruskal单向路径就能做,没必要构造双向
14     edge[tol].u=u;
15     edge[tol].v=v;
16     edge[tol++].w=w;
17 }
18 bool cmp(Edge a,Edge b) {
19     //排序函数,讲边按照权值从小到大排序
20     return a.w<b.w;
21 }
22 int find(int x) {
23     if(F[x]==-1)
24         return x;
25     else
26         return
27             F[x]=find(F[x]);
28 }
29 double Kruskal(int n) { //传入点数,返回最小生成树的权值,如果不连通返回-1
30     memset(F,-1,sizeof(F));
31     sort(edge,edge+tol,cmp);
32     int cnt=0;//计算加入的边数
33     double ans=0;
34     for(int i=0; i<tol; i++) {
35         int u=edge[i].u;
36         int v=edge[i].v;
37         double w=edge[i].w;
38 
39         int t1=find(u);
40         int t2=find(v);
41         if(t1!=t2) {        //利用并查集改变顶点集合状态
42             ans+=w;
43             F[t1]=t2;
44             cnt++;
45         }
46         if(cnt==n-1)         //n个结点,n-1条边,所以只要合并n-1次即可
47             break;
48     }
49     if(cnt<n-1)
50         return -1;//不连通
51     else
52         return ans;
53 }
54 double Dis(int x1,int y1,int x2,int y2) {
55     return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
56 }
57 int main() {
58     int i,j;
59     int m;
60     double w;
61 
62     scanf("%d",&m);
63     for(i=1; i<=m; i++) {
64         scanf("%d %d",&Point[i].x,&Point[i].y);
65     }
66     for(i=1; i<=m; i++)
67         for(j=i+1; j<=m; j++) { //这样够造的就是有向图,减少了构造空间
68             w=Dis(Point[i].x,Point[i].y,Point[j].x,Point[j].y);
69             addedge(i,j,w);
70         }
71     printf("%.2f\n",Kruskal(m));
72 }

 

类似的有在上一篇文章中整理。

int func11(string str){
    int n = str.length();
    vector<vector<int> >dp(n,vector<int>(n));//初始化为0
    
    for(int i=n-1;i>=0;i--){
        dp[i][i] = 1;
        for(int j = i+1;j<n;j++){
            if(str[i]==str[j])
                dp[i][j] = dp[i+1][j-1]+2;
            else 
                dp[i][j] = max(dp[i+1][j],dp[i][j-1]);
                
        }
    }
    return dp[0][n-1];
}
int main() {
    string str;
    cin>>str;
    for(int i=0;i<str.length();i++){
        if(str[i]>='A'&&str[i]<='Z'){
            str[i]+=('a'-'A');
        }
    }
    cout<<func11(str);
}

 

 
 
 
 
 
 
 
 
posted @ 2019-03-04 10:56 顾本无缘 阅读(...) 评论(...) 编辑 收藏
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
南理工初试试,很完整的试南京理工大学课程考试试卷 (学生考试用) 课程名称: 数据结构 学分: 3 大纲编号 062204 试卷编号: 考试方式: 闭卷 满分分值: 100 考试时间: 120 分钟 组卷日期: 2006年5月18日 组卷教师(签字) 张宏 审定人(签字) 王树梅 学生班级: 计算学院 04级 学生学号: 学生姓名: 一、 选择(1.5*20=30分) 1.若以{4,5,6,3,8}作为叶子结点的权值构造哈夫曼树,则带权路径长度是 A) 55 B)68 C)59 D)28 2. 无向图G=(V,E),其中:V={ a,b,c,d,e,f} , E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该图进行广度优先遍历,得到的顶点序列正确的是 A) a,b,e,c,d,f B) a,c,f,e,b,d C) a,e,b,c,f,d D) a,e,d,f,c,b 3. 对关键字码集合K={53,30,37,12,45,24,96},从空二叉树出发建立与集合K对应的二叉排序树,若希望得到树的高度最小,应选择下列哪个输入序列 。 A)45,24,53,12,37,96,30 B)12,24,30,37,45,53,96 C)37,24,12,30,53,45,96 D)30,24,12,37,45,96,53 4. 已知一组数{20,8,6,2,30,1}的排序过程为: (1)20,8,6,2,30,1 (2)1,8,6,2,30,20 (3)1,2,6,8,30,20 (4)1,2,6,8,20,30 问它是下面那一种排序: A)快速排序 B) 直接插入排序 C) 起泡排序 D) 选择排序 5.计算算法必须具备输入、输出和 等五个特征。 A) 可行性、可移植性和可扩充性 B)可行性、确定性和有穷性 C) 确定性、有穷性和稳定性 D)易读性、稳定性和安全性 6.设哈希表长为14,哈希函数是H(key)=key,表中已有数据的关键字为15,38,61,84共四个,现要将关键字为26的结点加到表中,用二次探测再散列法解决冲突,则放入的位置是 A) 8 B) 3 C)2 D)9 7.在一个单链表中,若要删除p所指结点的后继结点,则执行 。 A) p=p->next; p->next=p->next->next B) free(p->next) (C语言格式) 或 delete p->next (C++语言格式) C) p=p->next->next; D) p->next=p->next->next 8. 数组A的每个元素需要4个字节存放,数组有8行 10列,若数组以行为主顺序存放在内存SA开始的存储区中,则A中8行5列的元素的位置是 A) SA+74 B)SA+292 C)SA+296 D)SA+300 9-10.在一棵7阶B树中,若在某结点中插入一个新关键字而引起该结点分裂,则此结点中原有 (1) 个关键字;若在某结点中删去一个关键字而导致结点合并,则该结点中原有的关键字的个数是 (2) 。 (1) A)6 B)5 C)4 D)3 (2) A)4 B)3 C)2 D)1 11.已知四个元素a,b,c,d依次进栈,进栈过程中可出栈,下面那一种出栈顺序是不正确的 A)a,d,c,b B)b,c,d,a C)c,a,d,b D)c,d,b,a 12.队列操作的原则是 。 A) 先进先出 B) 后进先出 C) 只能进行插入 D)只能进行删除 13.在有n 个结点的二叉链表中,值为空链域的个数为 A)n-1 B)2n-1 C)n+1 D)2n+1 14.具有1080个结点的完全二叉树的深度为 A) 12 B)10 C)11 D)13 15.若已知一个栈的入栈序列是元素1,2,3,....,n,其输出序列为p1,p2,p3,…pn,若p1是n,则pi是( ) A) i B)n-i C)n-i+1 D)不确定 16.对于一个具有n个顶点的无向图,若采用邻接矩阵表示,则该矩阵的大小是

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值