一个长度为n的非负整型双向队列的“加权和”定义如下:
(1)依次从队列头或尾取一个数,共取n次。
(2)第i次取出的数乘以系数i得到加权数。
(3)将n个加权数求和,即为该队列的“加权和”。
编写函数,计算给定一个长度为n的非负整型双向队列的“加权和”的最大值。(双向队列可以用一维数组或链表表示)。
思路:贪心算法,每次选两端最小的。因为要求最大值就得让较小数乘较小系数,较大数乘较大系数。
int jqh(int a[],int n)
{
int i=0;//左指针
int j=n-1;//右指针
int sum=0;//加权和
int k=1;//权重
while(i<=j) //使用贪心算法每次寻找当前最小数去乘权重
{
if(a[i]>a[j])
{
sum=sum+a[j]*(k++);
j--;
}
else
{
sum=sum+a[i]*(k++);
i++;
}
}
return sum;
}
用n*n的矩阵表示有向图,有边值为1,无边值为0.
编写函数,给定节点i和步长k,计算节点i经k步能到达的所有节点。
int n;
int visited[maxsize];
int print[maxsize];
void dfs(int d[maxsize][maxsize],int i,int k)
{
visited[i]=1;
if(k==0) //距离起点已经k步
{
if(print[i]==0) //未输出过
{
printf("%d",i);
print[i]=1;
}
visited[i]=0;//回溯时要还原
return;
}
else
{
for(int j=0;j<n;j++)
{
if(d[i][j]==1&&visited[j]==0)
{
dfs(d,j,k-1);
}
}
}
visited[i]=0; //回溯时要还原
}
什么是堆栈?什么是队列?请分别给出堆栈和队列具体应用的实例。
堆栈是一种操作受限的线性表,它只允许在一端进行插入,删除,和访问操作,通常将进行插入,删除,访问的一端称为栈顶,另一端称为栈底。堆栈又称为后进先出的线性表。
队列也是一种操作受限的线性表,它只允许在表的一端进行插入,在表的另一端进行删除,允许删除的一端被称为队头,允许插入的一端被称为队尾。队列也被称为先进先出的线性表。
堆栈 :括号匹配,递归。
队列:层次遍历。
设G=(V,E)是一个连通图,已知图中两个顶点i,j,请设计一个算法给出从顶点i到顶点j的所有简单路径。
typedef struct Arcnode
{
int adjvex;
struct Arcnode *nextarc;
}Arcnode;
typedef struct Vnode
{
int data;
Arcnode *firstarc;
}Vnode;
typedef struct graph
{
Vnode adjlist[maxsize];
int n,e;
}graph;
int path[maxsize];
int visit[maxsize];
void DFS(graph g,int v,int to,int d)//v是当前节点,to是目标节点,d是从开始到现在的距离
{
visit[v]=1;
path[++d]=v;//存入路径
if(v==to&&d>0) //如果当前结点就是目标结点
{
for(int i=1;i<=d;i++)
printf("%d ",path[i]);
}
else
{
Arcnode *p=g.adjlist[v].firstarc;//p指向当前结点的第一个邻接结点
while(p!=NULL)
{
if(visit[p->adjvex]==0)
{
DFS(g,p->adjvex,to,d);
}
p=p->nextarc;
}
}
visit[v]=0;
}
void SimplePath(graph g,int i,int j)
{
DFS(G,i,j,0);
}