给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。输入格式:输入数据的第1行是数字三角形的行数n,1≤n≤100。接下来n行是数字三角形各行中的数字。所有数字在0..99之间。输出格式:输出数据只有一个整数,表示计算出的最大值。//动态规划
用i来表示x坐标轴上坐标为[i-1,i]的长度为1的区间,并给出n个不同的整数,表示n个这样的区间。现在要求画m条线段覆盖住所有的区间,条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,并且线段的数目不超过m。输入格式:输入包括多组数据,每组数据的第一行表示区间个数n(1≤n≤200) 和所需线段数m(1≤m≤50),第二行表示n个点的坐标i(1≤i≤200)。输出格式:每组输出占一行,
输入格式:第一行输入活动数目n(0<n<100);以后输入n行,分别输入序号为1到n的活动使用中心的开始时刻a与截止时刻b(a,b为整数且0<=a<b<24,a,b输入以空格分隔)。输出格式:输出最佳安排序列所包含的各个活动(按照活动被安排的次序,两个活动之间用逗号分隔),如果有多个活动安排序列符合要求输出字典序最小的序列。输入样例:6 8 10 9 16 11 16
有一个长度为n(n <= 240)的正整数,从中取出s(s < n)个数,使剩余的数保持原来的次序不变,求这个正整数经过删数之后最小是多少。输入:178543 4样例输出:13把对s个数字的删除,看成是一个逐步实现的过程,每一步删除一个数字,用s步完成对s个数字的删除。每一步总是选择一个使剩下的数最小的数字完成删除。按照从左向右的顺序进行搜索,删除第一个递减区间的首位数字。//删数问题
在8*8格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?此题采用试探的方式,也就是回溯法的思想。#include<stdio.h>//将棋盘当做行坐标、列坐标都从1开始的二维数组int q[10];//某行上的皇后所在列的位置int flag[10]={0};//该列是否安全(0安全,1不安全)int list1[15]
从n个不同元素任取m(m<=n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列,当m=n时所有的排列情况叫全排列。现输入n个递增的数,请你输出这n个数的全排列。全排列输出顺序如样例所示。输入格式:第一行先输入一个整数n(1<=n<=10)。接下来是一行输入n个由空格分开的互不相同的整数num (1 <= num <= 90000)。输出格式
给出N (N <= 100000) 个数,然后进行M (M <= 50) 次询问,每次询问时,输入一个数X (1 <= X <= N),输出N个数中第X大的数。输入格式:首先输入一个整数N,代表有N个数,下面一行包含N个整数,用空格隔开。然后为一个整数M,代表有M次询问,下面的M行,每行一个整数X。输出格式:输出N个数中第X大的数。#include<stdio.h&g
现有一个包含n个整数(1<=n<=900000)的无序序列(保证序列内元素各不相同),输入一个整数k(1<=k<=n),请用较快的方式找出该序列的第k小数并输出。输入格式:第一行先输入两个整数,n和k。接下来是一行输入n个由空格分开的互不相同的整数num(1<=num<=90000000)。输出格式:输出该组数据中第k小的数num。//快速排序(递归和分治)#i
本题要求实现一个快速排序函数。 给定 N ( N<= 1000 ) 个 int 范围内的整数,要求用快速排序对数据进行降序排列。//快速排序(递归和分治)#include<stdio.h>void Quick_sort(int a[],int left,int right){ int i,j; i=left; j=right; int key=a[left
快速排序是利用分治递归技术实现的一种比较高效的方法。本题要求实现一个快速排序函数。给定 N ( N<= 1000 ) 个 int 范围内的整数,要求用快速排序对数据进行升序排列。//快速排序(递归和分治)#include<stdio.h>void Quick_sort(int a[],int left,int right){ int i,j; i=left; j
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。输入
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。#include<stdio.h>typedef str
输入格式:读入n及n个整数。输出格式:输出逆置后的n个整数,以空格分隔(最后一个数的后面没有空格)。#include<stdio.h>typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;LinkList ListCreat(){ LinkList L,tail,p; L=(Lin
输入格式:读入n及n个整数。输入要插入元素的位置和大小输出格式:输出插入元素后的链表,以空格分隔(最后一个数的后面没有空格)。#include<stdio.h>typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;LinkList ListCreat(){ LinkList L,tail
for(表达式1;表达式2;表达式3) 语句(1)首先求解表达式1,。其值一般用于给循环初始变量赋值。(2)求解表达式2,若其值为非0,则执行for语句中指定的循环体语句,然后执行下面的第(3)步,若为0,则结束循环,转到第(5)步。表达式2一般用于条件判断,并决定循环是否结束。(3)求解表达式3。表达式3一般用于改变循环变量的值,使循环趋向结束。(4)返回第二步,看是否满足表达式2,从而确定是否
在数组相关题目中,涉及到删除元素时我们通常想到的做法是找到被删除的元素的位置,然后将它后面的元素向前移动。 在一些对数组元素要求不为0的题目中,我们可以使用以下方法,减少代码量:首先找到被删除的元素,将它置为零,然后在输出数组元素时将不为0的元素输出,从而达到了删除元素的效果。但是一定要注意题目对数组元素取值的规定,若题目规定数组元素可以为0,则此
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。第一行输入一个整数(0≤N≤50)。第二行输入N个整数,输入用空格分隔的N个整数。第三行输入想要进行删除的一个整数。输出为一行,删除指定数字之后的序列。#include<stdio.h>int main(){ int n,i
在一个有序的数组中找到要插入元素应该在的位置时,该位置后面的元素都要统一往后移,给要插入的元素留出位置。要注意的是,后移时最后一个元素先移动,然后倒数第二个移动,依次类推。。。有以下两种做法:#include<stdio.h>int main(){ int n,i; scanf("%d",&n); int a[51]; for(i=
描述输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。数据范围: , 序列中的值满足 输入描述:输入包含三行,第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。第二行包含n个整数,用空格分隔。第三行包含m个整数,用空格分隔。输出描述:输出为一行,输出长度为n+m的升序序列,即长度为n的
#include<stdio.h>//将数组里的数字按相反顺序存放void exchange(int a[],int n){ int i=0; int t; for(i=0;i<=(n-1)/2;i++) { int j=n-1-i; t=a[i]; a[i]=a[j]; a[j]=t; }}i
#include<stdio.h>void swap(int *p1,int *p2){ int t; t=*p1; *p1=*p2; *p2=t;}void exchange(int *pa,int *pb,int *pc){ if(*pa<*pb) swap(pa,pb); if(*pa<*pc) swap
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号