ACM程序设计竞赛例题

合集下载

ACM程序设计-赛题样例

ACM程序设计-赛题样例

ACM程序设计-赛题样例座位调整题目描述:百度办公区里到处摆放着各种各样的零食。

百度人力资源部的调研发现,员工如果可以在自己喜欢的美食旁边工作,工作效率会大大提高。

因此,百度决定进行一次员工座位的大调整。

调整的方法如下:1 .首先将办公区按照各种零食的摆放分成 N 个不同的区域。

(例如:可乐区,饼干区,牛奶区等等)。

2 .每个员工对不同的零食区域有不同的喜好程度(喜好程度度的范围为 1 — 100 的整数,喜好程度越大表示该员工越希望被调整到相应的零食区域)。

3 .由于每个零食区域可以容纳的员工数量有限,人力资源部希望找到一个最优的调整方案令到总的喜好程度最大。

数据输入:第一行包含两个整数 N , M ,( 1<=N ,M<=300 )。

分别表示 N 个区域和 M 个员工。

第二行是 N 个整数构成的数列 a ,其中 a[i] 表示第 i 个区域可以容纳的员工数,(1<=a[i]<=M , a[1]+a[2]+..+a[N]=M) 。

紧接着是一个 M*N 的矩阵 P , P ( i , j )表示第 i 个员工对第 j 个区域的喜好度。

答案输出:对于每个测试数据,输出可以达到的最大的喜好程度。

输入样例3 31 1 1100 50 25100 50 25100 50 25输出样例175#include<stdio.h>void main(){int n,m,l=0,i,j,s,t,sum=0;int a[100],p[100][100],b[100],c[100];for(i=0;i<100;i++){a[i]=0,c[i]=0,b[i]=0;for(j=0;j<100;j++)p[i][j]=0;}scanf("%d %d",&n,&m);for(i=0;i<n;i++){scanf("%d ",&a[i]);}for(i=0;i<n;i++){for(j=0;j<m;j++){scanf("%d",&p[i][j]);}}i=0;frist:if(i>=m)goto finish;if(l>0){for(s=0;s<l;s++){t=c[s];for(j=0;j<m;j++){p[t][j]=0;}}}for(s=0;s<m;s++){b[s]=0;}for(s=0;s<n;s++){b[s]=p[s][i];}for(s=0;s<n-1;s++){for(j=0;j<n-1-s;j++){if(b[j]<b[j+1]){t=b[j];b[j]=b[j+1]; b[j+1]=t;}}}// printf("%d\t",b[0]); // test++;for(s=0;s<a[i];s++){sum=sum+b[s];}s=0;sec:if(s>=a[i]){i++;goto frist;}for(t=0;t<n;t++){if(b[s]==p[t][i]){c[l]=t;l++;break;else continue;}s++;goto sec;finish:// printf("\n");printf("最大的喜好程度为:%d\n",sum);// printf("%d",test);}#include<stdio.h>#include<stdlib.h>void main(){int s,t,u,v,w,x,y,z,sum=0,a[20],b[20][20],c[20],d[20],sumx[80],*p=sumx,max; scanf("%d%d",&x,&y);for(z=0;z<x;z++){scanf("%d",&a[z]);}for(z=0;z<y;z++){c[z]=z;d[z]=z;}for(w=0;w<y;w++){for(z=0;z<x;z++){scanf("%d",&b[w][z]);}}sum=0;for(z=0;z<y;z++){sum+=b[0][z];for(w=z;w<y-1;w++)d[w]=d[w+1];}for(w=0;w<y-1;w++){s=d[w];sum+=b[1][s];for(v=w;v<y-2;v++){d[v]=d[v+1];}for(u=0;u<y-2;u++){s=d[u];sum+=b[1][s];for(t=u;t<y-3;t++){d[u]=d[u+1];}for(t=0;t<y-3;t++){s=d[t];sum+=b[2][s];for(z=0;z<y;z++){d[20]=c[20];}}*p=sum;sum=0;p++;}}}t=1;max=sumx[0];while(sumx[t]){if(sumx[t]>max)max=sumx[t];t++;}printf("%d\n",max);}#include<stdio.h>#include<malloc.h>int main(int argc,char** argv){int N,M,*a,**p,*temp,i,j,k,max=0;;printf("Please input area and staff num:");scanf("%d %d",&N,&M);a=(int*)malloc(sizeof(int)*N);printf("\nPlease input staff num of each area:");for(i=0;i<N;i++)scanf("%d",&a[i]);p=(int**)malloc(sizeof(int)*N);printf("\nPlease input like:");for(i=0;i<M;i++)p[i]=(int*)malloc(sizeof(int)*M);for(i=0;i<M;i++)for(j=0;j<N;j++)scanf("%d",&p[i][j]);temp=(int*)malloc(sizeof(int)*M);for(i=0;i<N;i++){if(i<N-1){for(j=0;j<M;j++){k=i+1;temp[j]=0;while(k<N){temp[j]+=p[j][i]-p[j][k];k++;}}int temp1,temp2;while(a[i]){temp1=-101;temp2=0;for(j=0;j<M;j++){if(temp[j]>temp1){temp1=temp[j];temp2=j;}}max+=p[temp2][i];printf("%d %d %d\n",p[temp2][i],temp2,i);for(int m=0;m<N;m++)p[temp2][m]=-101;printf("\n");for(int q=0;q<M;q++){for(int w=0;w<N;w++){printf(" %d ",p[q][w]);}printf("\n");}temp[temp2]=-101;a[i]--;}}else{int temp3,temp4;while(a[i]){temp3=-101;temp4=0;for(j=0;j<M;j++){if(p[j][i]>temp3){temp3=p[j][i];temp4=j;}}max+=p[temp4][i];printf("%d %d %d\n",p[temp4][i],temp4,i);for(int m=0;m<N;m++)p[temp4][m]=-101;printf("\n");for(int q=0;q<M;q++){for(int w=0;w<N;w++){printf(" %d ",p[q][w]);}printf("\n");}temp[temp4]=-101;a[i]--;}}}printf("Max=%d\n",max);return0;//Your program should return 0 on normal termination.}蝈蝈式的记分内容描述:蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。

山东科技大学第二届ACM程序设计大赛试题

山东科技大学第二届ACM程序设计大赛试题

山东科技大学第二届ACM程序设计大赛试题册试题共14页,题目共计12道山东科技大学第二届ACM 程序设计大赛试题册Problem A 简单计算Description给出n 个十进制的数,找出这n 个数的二进制表示中1的个数最少的数。

Input输入的第一行为一个正整数T (1≤T ≤20),代表测试数据组数。

对于每组测试数据,输入的第一行为一个正整数n (1≤n ≤10000),第二行为n个正整数A 1、A 2、…、A n (1≤A i ≤109),每个数之间以空格分隔。

Output每组数据输出一行,先输出数据组数,再输出二进制中含1最少的数,如果存在多个数符合条件,输出最小的那个。

具体输出格式见样例输出。

Sample Input Sample Output山东科技大学第二届ACM 程序设计大赛试题册Problem B 关键字搜索Description我们的新网站具有了全新的搜索功能,使用了2个通配符“*”和“?”,其中“*”表示0或者多个小写字母,“?”代表1个字母。

当我们输入一个关键字的时候,我们在不确定的地方就使用通配符。

我们在数据库里面有多条记录,每条记录都是由小写字母组成,现在给出一个关键字,你能告诉我数据库里面有多少条与关键字相匹配的记录吗?例如: 如果关键字是j*y*m*y?,那么jiyanmoyu ,jyanmoyu ,jymyu 都是相匹配的记录。

Input第一行输入一个T (T ≤20),表示有T 组测试数据。

对于每组测试数据,第一行是输入的关键字,接下是数据库里面的所有记录的条数n ,1≤n ≤10000,每条记录的长度不超过50个小写字母。

Output对于每组测试数据,输出与关键字相匹配的总记录条数,占一行。

Sample Input Sample Output山东科技大学第二届ACM 程序设计大赛试题册Problem C 正方形Description在二维坐标轴内给出四个点,这四个点能否构成一个正方形。

ACM软件大赛之编程大赛题目(附部分答案)

ACM软件大赛之编程大赛题目(附部分答案)

ACM 软件大赛之编程大赛比赛注意事项:l 比赛时间为3小时(小时(180180分钟);比赛分两个阶段:第一阶段限时30分钟,完成公示的3题,第二阶段限时150分钟(事先完成第一阶段题目的小组可提前进入第二阶段); l 比赛第一阶段的3道题目将在前期宣传中告知参赛选手,比赛第二阶段的题目将由赛事主席当场公布竞赛题目;主席当场公布竞赛题目;l 前两阶段题目分为三个分值(前两阶段题目分为三个分值(55分、分、1010分、分、1515分),第一阶段3道公示题都为5分;第二阶段总共15道题,根据不同的难度分值不同,分别为5道5分题,分题,55道10分题,分题,55道15分题;第一阶段参赛队员不可参考任何相关资料;第二阶段参赛队员可以携带诸如书,如书,手册,程序清单等参考资料。

手册,程序清单等参考资料。

手册,程序清单等参考资料。

比赛过程中队员不得携带任何电子媒质的资料;参比赛过程中队员不得携带任何电子媒质的资料;参赛者可以选择自己擅长的语言(赛者可以选择自己擅长的语言(C,C++,JAVA C,C++,JAVA 等等)进行编写等等)进行编写l 考虑到大一和大二学生的知识掌握程度,大一参加选手一开始就会有10分的分数,最后总分是由所做题目及初始的10分相加得到。

分相加得到。

l 每组队员根据安排使用电脑,小组人数为两人的使用一台电脑,超过两人的使用两台电脑,每台的电脑配置完全相同;脑,每台的电脑配置完全相同;l 各小组每做完一题或几题,必须交予评委老师运行,评委老师当场给分;各小组每做完一题或几题,必须交予评委老师运行,评委老师当场给分; l 如在比赛中发现作弊等行为,将取消比赛资格。

如在比赛中发现作弊等行为,将取消比赛资格。

第一阶段公示题目:题目一:(5分) 打印以下图形,纵遵从字母顺序,行字符数遵从斐波那契数列ABCCDDD EEEEEFFFFFFFFGGGGGGGGGGGGG#include<iostream>int f(int x){int a = 1 , b = 0;int max_ = x;int sum = 0; for(int i = 0; i < max_ ; i++){sum = a + b;a = b;b = sum;}return sum;}void loop_print(int num,char chr){for(int i = 0; i < num ;i++)std::cout<<chr;std::cout<<"\n";}int main(){int line_max = 7;char chr = 'A';for(int line = 0; line < line_max; line++){loop_print(f(line+1),chr);chr++;}return 0;}题目二:(5分)有个电子钟,12点显示为12:00(即12小时制),那么请问一天24时间内,出现连续3个相同数字的钟点有几个?#include<iostream>using namespace std;bool check(int me){int h= me/100;int m= me-100*h;return h<=12&&m<=59&&h>0?true:false;//12小时制小时制}int main(){int me=0;int j(0);//总计数器总计数器while( me<1270){//max 12:59int t= me;int n[4];for(int i=0;i<4;i++){n[i]=t%10;t /= 10;}if(n[1]==n[2]&&(n[0]==n[1]||n[3]==n[1])&&check( me)){//cout<<n[3]<<n[2]<<":"<<n[1]<<n[0]<<"\n";//testj++;me++;}cout<<"total: "<<j*2<<endl;}题目三:(5分)10进制的四位数中有几个符合如下特征:将其分别表示为16进制、10进制、12进制,在每种状态下,分别将各个位上的数相加,能得到3个相等10进制数。

CDOJ第七届ACM趣味程序设计竞赛第三场(正式赛)题解

CDOJ第七届ACM趣味程序设计竞赛第三场(正式赛)题解

CDOJ第七届ACM趣味程序设计竞赛第三场(正式赛)题解宝贵资源题⽬连接:题意平⾯上给n个点(n<=1000),要求找⼀个⾯积最⼩的正⽅形,将所有的点都囊括进去。

要求正⽅形的边必须平⾏于坐标轴。

题解:对于这道题,我们可以⾸先找⼀个满⾜题意的,并且⾯积是最⼩的矩形。

假设矩形的长为L,宽为W,那么很显然:L = (MaxX - MinX)W = (MaxY - MinY)MaxX,MaxY 指题⽬中输⼊的最⼤横、纵坐标的值,MinX,MinY 指题⽬中输⼊的最⼩横,纵坐标的值。

因为我们需要得到正⽅形,那么正⽅形的边长L 取 max(L,W)即可。

这道题就结束了~代码如下:#include<iostream>#include<stdio.h>using namespace std;unsigned long long x1=99999999999LL,x2=0,y1=99999999999LL,y2=0;int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++){unsigned long long X ,Y;cin>>X>>Y;x1 = min(x1,X);x2 = max(x2,X);y1 = min(y1,Y);y2 = max(y2,Y);}unsigned long long l = max(x2-x1,y2-y1);cout<<l*l<<endl;}The Desire of Asuna题⽬连接:题意给你n条链,每条链的长度为a[i]每次操作你可以选择⼀条链,使得这条链的长度减1,然后使得任意两条链连接在⼀起,连接之后的长度要加1。

询问最少操作次数。

题解:贪⼼。

我们选择长度减⼩的链,⼀定是可选的,并且长度最⼩的链。

我们选择合并的链,⼀定是当前长度最⼤的两条链。

ACM程序大赛选拔初赛试题 - 参考答案

ACM程序大赛选拔初赛试题 - 参考答案

《解方程》参考答案:
#include <stdio.h> #include <math.h> void main() {
int a,b,c,d; float x1,x2; scanf("%d %d %d %d",&a,&b,&c,&d); if(a==0) printf("x=%.2f",(float)(d-c)/b); else {
float dr=b*b-4*a*c; c-=d; if(dr>0) {
x1=(-b-sqrt(dr))/(2*a); x2=(-b+sqrt(dr))/(2*a); printf("x1=%.2f x2=%.2f\n",x1,x2); } if(dr==0) { x1=(-b+sqrt(dr))/(2*a); printf("x=%.2f\n",x1); } if(dr<0) printf("no answer\n"); } }
3、计算器 (难度系数:★★★☆☆)
题意:输入一个没有答案的算术式子,用计算机求出输出它的结果。 输入:一个字符串形如“a#b=”(#代表运算符号)。注意:输入的字符串中 a,b 代表的数 都为自然数。而且 a,b 的范围都是从 0 到 999。 输出:字符串对应的算式的答案。答案需保留两位有效数字。若无答案则输出“error” 示例:
输出:第1 行是选出顺序,第2 行是两名幸运儿的开始位置(按升序排列),位置编号之 间用一个空格分开。
示例:
输入(只选一组) 3 5 12
输出(幸运儿的位置)
2 13 241 53 2 4 6 8 10 12 3 7 11 5 19

acm竞赛试题及答案

acm竞赛试题及答案

acm竞赛试题及答案ACM竞赛试题及答案1. 问题描述:给定一个整数数组,找出数组中没有出现的最小的正整数。

2. 输入格式:第一行包含一个整数n,表示数组的长度。

第二行包含n个整数,表示数组的元素。

3. 输出格式:输出一个整数,表示数组中没有出现的最小的正整数。

4. 样例输入:53 4 1 2 55. 样例输出:66. 问题分析:首先,我们需要理解题目要求我们找出数组中缺失的最小正整数。

这意味着我们需要检查数组中的每个元素,并确定最小的正整数是否在数组中。

7. 算法描述:- 遍历数组,使用一个哈希集合记录出现的数字。

- 从1开始,检查每个正整数是否在哈希集合中,直到找到不在集合中的最小正整数。

8. 代码实现:```pythondef find_missing_positive(nums):seen = set()for num in nums:if num <= 0:continuewhile num in seen or num > len(nums):num += 1seen.add(num)return min(set(range(1, len(nums) + 1)) - seen)```9. 测试用例:- 输入:[3, 4, -1, 1]- 输出:210. 答案解析:在给定的测试用例中,数组[3, 4, -1, 1]中没有出现的最小正整数是2。

这是因为-1不是正整数,所以可以忽略。

数组中已经出现了1和3,所以下一个最小的正整数就是2。

11. 注意事项:- 确保数组中的元素是整数。

- 考虑数组中可能包含0或负数的情况。

- 算法的时间复杂度应尽可能低。

12. 扩展思考:- 如果数组非常大,如何优化算法?- 如果数组中的元素可以是浮点数,算法应该如何修改?13. 参考答案:- 针对大数组,可以考虑使用更高效的数据结构,如平衡二叉搜索树。

- 如果元素是浮点数,需要先将其转换为整数,然后再进行处理。

acm大赛试题及答案

acm大赛试题及答案

acm大赛试题及答案ACM大赛试题及答案1. 题目一:字符串反转问题描述:编写一个程序,输入一个字符串,输出其反转后的字符串。

输入格式:输入包含一个字符串,字符串长度不超过100。

输出格式:输出反转后的字符串。

示例:输入:hello输出:olleh答案:```pythondef reverse_string(s):return s[::-1]input_string = input().strip()print(reverse_string(input_string))```2. 题目二:计算阶乘问题描述:编写一个程序,输入一个非负整数n,输出n的阶乘。

输入格式:输入包含一个非负整数n,n不超过20。

输出格式:输出n的阶乘。

示例:输入:5输出:120答案:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)n = int(input())print(factorial(n))```3. 题目三:寻找最大数问题描述:给定一个包含n个整数的数组,找出数组中的最大数。

输入格式:输入包含一个整数n,表示数组的大小,随后是n个整数。

输出格式:输出数组中的最大数。

示例:输入:5 1 2 3 4 5输出:5答案:```pythonn = int(input())numbers = list(map(int, input().split()))max_number = max(numbers)print(max_number)```4. 题目四:判断闰年问题描述:编写一个程序,输入一个年份,判断该年份是否为闰年。

输入格式:输入包含一个整数,表示年份。

输出格式:如果输入的年份是闰年,则输出"Yes",否则输出"No"。

示例:输入:2000输出:Yes答案:```pythonyear = int(input())if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):print("Yes")else:print("No")```5. 题目五:斐波那契数列问题描述:编写一个程序,输入一个非负整数n,输出斐波那契数列的第n项。

acm试题及答案

acm试题及答案

acm试题及答案1. 问题描述:给定一个整数数组,找出数组中最长的连续子数组,使得子数组中所有元素的和等于给定的数值。

2. 输入格式:第一行包含两个整数 n 和 k,分别表示数组的长度和给定的数值。

第二行包含 n 个整数,表示整数数组。

3. 输出格式:输出最长的连续子数组的长度。

如果不存在这样的子数组,则输出 0。

4. 样例输入:```5 31 2 3 1 2```5. 样例输出:```3```6. 分析:要解决这个问题,我们可以遍历数组,使用一个哈希表来存储前缀和及其对应的索引。

当我们遇到相同的前缀和时,就可以计算出子数组的长度。

7. 算法:1. 初始化一个哈希表,用于存储前缀和及其索引。

2. 初始化一个变量 maxLen 来存储最长子数组的长度,初始值为 0。

3. 遍历数组,计算当前的前缀和。

4. 检查当前前缀和是否已经在哈希表中,如果在,则更新 maxLen。

5. 如果当前前缀和不在哈希表中,将其添加到哈希表中。

6. 最后输出 maxLen。

8. 代码实现:```pythondef find_max_length(nums, k):prefix_sum = {0: -1}max_len = 0current_sum = 0for i in range(len(nums)):current_sum += nums[i]if (current_sum - k) in prefix_sum:max_len = max(max_len, i - prefix_sum[current_sum - k])if current_sum not in prefix_sum:prefix_sum[current_sum] = ireturn max_lenn, k = map(int, input().split())nums = list(map(int, input().split()))print(find_max_length(nums, k))```9. 注意事项:- 确保输入的数组长度和给定数值是有效的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

备战ACM资料一:知识点数据结构:1,单,双链表及循环链表2,树的表示与存储,二叉树(概念,遍历)二叉树的应用(二叉排序树,判定树,博弈树,解答树等)3,文件操作(从文本文件中读入数据并输出到文本文件中)4,图(基本概念,存储结构,图的运算)数学知识1,离散数学知识的应用(如排列组合、简单的图论,数理逻辑)2,数论知识3,线性代数4,组合代数5,计算几何二算法1,排序算法(冒抛法,插入排序,合并排序,快速排序,堆排序)2,查找(顺序查找,二分发)3,回溯算法4,递归算法5,分治算法6,模拟法7,贪心法8,简单搜索算法(深度优先,广度优先),搜索中的剪枝,A*算法9,动态规划的思想及基本算法10,高精度运算三、ACM竞赛的题型分析竞赛的程序设计一般只有16种类型,它们分别是:Dynamic Programming (动态规划)Greedy (贪心算法)Complete Search (穷举搜索)Flood Fill (不知该如何翻译)Shortest Path (最短路径)Recursive Search Techniques (回溯搜索技术)Minimum Spanning Tree (最小生成树)Knapsack (背包问题)Computational Geometry (计算几何学)Network Flow (网络流)Eulerian Path (欧拉回路)Two-Dimensional Convex Hull (不知如何翻译)BigNums (大数问题)Heuristic Search (启发式搜索)Approximate Search (近似搜索)Ad Hoc Problems (杂题)四ACM竞赛参考书《实用算法的分析与程序设计》(吴文虎,王建德著,电子工业出版社,竞赛类的黑宝书)《青少年国际和全国信息学(计算机)奥林匹克竞赛指导)――组合数学的算法和程序设计》(吴文虎,王建德著,清华大学出版社,参加竞赛组合数学必学)《计算机算法设计与分析》(王晓东编著,最好的数据结构教材)《数据结构与算法》(傅清祥,王晓东编著,我所见过的最好的算法教材)《信息学奥林匹克竞赛指导――1997-1998竞赛试题解析》(吴文虎,王建德著,清华大学出版社)《计算机程序设计技巧》 D.E.Kruth著,算法书中最著名的《葵花宝典》,大师的作品,难度大)《计算几何》周陪德著《ACM国际大学生程序设计竞赛试题与解析(一)》(吴文虎著,清华大学出版社)《数学建模竞赛培训教材》共三本叶其孝主编《数学模型》第二版姜启源《随机规划》《模糊数学》《数学建模入门》徐全智《计算机算法设计与分析》国防科大五常见的几个网上题库常用网站:1)信息学初学者之家:/(2)大榕树编程世界:/~drs/program/default.asp(3)中国教育曙光网:/aosai/(4)福建信息学奥林匹克:/fjas/index.htm(5)第20届全国青少年信息学奥林匹克竞赛:/(6)第15届国际青少年信息学奥林匹克竞赛:/(7)全美计算机奥林匹克竞赛:/usacogate(8)美国信息学奥林匹克竞赛官方网站:/(9)俄罗斯Ural州立大学:http://acm.timus.ru/(10)西班牙Valladolid大学:http://acm.uva.es/problemset(11)ACM-ICPC:/icpc/(12)北京大学:/JudgeOnline/index.acm(13)浙江大学:/(14)IOI:http://olympiads.win.tue.nl/ioi/(15)2003年江苏省信息学奥林匹克竞赛夏令营:(16)(17)(18)(19)/downldmanag/index.asp(20) colin_fox/colin_fox五如何备战ACM/ICPC1,个人准备(算法书,习题集,网上做题和讨论)2,1000题=亚洲冠军=世界决赛3,做好资料收集和整理工作实验一:递归与分治1.二分查找2.合并排序3.快速排序实验二:回溯1.0-1背包问题2.装载问题3.堡垒问题(ZOJ1002)4.*翻硬币问题5.8皇后问题6.素数环问题7.迷宫问题8.*农场灌溉问题(ZOJ2412)9.*求图像的周长(ZOJ1047)10.*骨牌矩阵11.*字母转换(ZOJ1003)12.*踩气球(ZOJ1004)实验三:搜索1.Floodfill2.电子老鼠闯迷宫3.跳马4.独轮车5.皇宫小偷6.分酒问题7.*找倍数8.*8数码难题实验四:动态规划1.最长公共子序列2.计算矩阵连乘积3.凸多边形的最优三角剖分4.防卫导弹5.*石子合并6.*最小代价子母树7.*旅游预算8.*皇宫看守9.*游戏室问题10.*基因问题11.*田忌赛马实验五:贪心与随机算法1.背包问题2.搬桌子问题3.*照亮的山景4.*用随即算法求解8皇后问题5.素数测试实验一:递归与分治实验目的理解递归算法的思想和递归程序的执行过程,并能熟练编写递归程序。

掌握分治算法的思想,对给定的问题能设计出分治算法予以解决。

实验预习内容编程实现讲过的例题:二分搜索、合并排序、快速排序。

对本实验中的问题,设计出算法并编程实现。

试验内容和步骤1.二分查找在对线性表的操作中,经常需要查找某一个元素在线性表中的位置。

此问题的输入是待查元素x和线性表L,输出为x在L中的位置或者x不在L中的信息。

程序略2.合并排序程序略3.快速排序程序略实验总结及思考合并排序的递归程序执行的过程实验二:回溯算法实验目的:熟练掌握回溯算法实验内容:回溯算法的几种形式a)用回溯算法搜索子集树的一般模式void search(int m){if(m>n) //递归结束条件output(); //相应的处理(输出结果)else{a[m]=0; //设置状态:0表示不要该物品search(m+1); //递归搜索:继续确定下一个物品a[m]=1; //设置状态:1表示要该物品search(m+1); //递归搜索:继续确定下一个物品}}b)用回溯算法搜索子集树的一般模式void search(int m){if(m>n) //递归结束条件output(); //相应的处理(输出结果)elsefor(i=m;i<=n;i++){swap(m,i); //交换a[m]和a[i]if()if(canplace(m)) //如果m处可放置search(m+1); //搜索下一层swpa(m,i); //交换a[m]和a[i](换回来)}}习题1.0-1背包问题在0 / 1背包问题中,需对容量为c 的背包进行装载。

从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。

对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。

程序如下:#include <stdio.h>void readdata();void search(int);void checkmax();void printresult();int c=35, n=10; //c:背包容量;n:物品数int w[10], v[10]; //w[i]、v[i]:第i件物品的重量和价值int a[10], max; //a数组存放当前解各物品选取情况;max:记录最大价值//a[i]=0表示不选第i件物品,a[i]=1表示选第i件物品int main(){readdata(); //读入数据search(0); //递归搜索printresult();}void search(int m){if(m>=n)checkmax(); //检查当前解是否是可行解,若是则把它的价值与max比较else{a[m]=0; //不选第m件物品search(m+1); //递归搜索下一件物品a[m]=1; //不选第m件物品search(m+1); //递归搜索下一件物品}}void checkmax(){int i, weight=0, value=0;for(i=0;i<n;i++){if(a[i]==1) //如果选取了该物品{weight = weight + w[i]; //累加重量value = value + v[i]; //累加价值}}if(weight<=c) //若为可行解if(value>max) //且价值大于maxmax=value; //替换max}void readdata(){int i;for(i=0;i<n;i++)scanf("%d%d",&w[i],&v[i]); //读入第i件物品重量和价值}void printresult(){printf("%d",max);}2.装载问题有两艘船,载重量分别是c1、c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。

确定是否有可能将所有集装箱全部装入两艘船。

提示:求出不超过c1的最大值max,若总重量-max < c2则能装入到两艘船。

3.堡垒问题(ZOJ1002)如图城堡是一个4×4的方格,为了保卫城堡,现需要在某些格子里修建一些堡垒。

城堡中的某些格子是墙,其余格子都是空格,堡垒只能建在空格里,每个堡垒都可以向上下左右四个方向射击,如果两个堡垒在同一行或同一列,且中间没有墙相隔,则两个堡垒都会把对方打掉。

问对于给定的一种状态,最多能够修建几个堡垒。

程序主要部分如下:int main(){readdata(); //读入数据search(0); //递归搜索printresult();}void search(int m){int row, col;row=m/n; //求第m个格子的行号col=m%n; //求第m个格子的列号if(m>=n*n)checkmax(); //检查当前解是否是可行解,若是则把它的价值与max比较else{search(m+1); //该位置不放堡垒递归搜索下一个位置if(canplace(m)) //判断第m个格子是否能放堡垒{place(m); //在第m个格子上放置一个堡垒search(m+1); //递归搜索下一个位置takeout(m); //去掉第m个格子上放置的堡垒}}}4.翻硬币问题把硬币摆放成32×9的矩阵,你可以随意翻转矩阵中的某些行和某些列,问正面朝上的硬币最多有多少枚?提示:(1)任意一行或一列,翻两次等于没有翻;(2)对于9列的任何一种翻转的情况,每一行翻与不翻相互独立。

5.8皇后问题在一个8×8的棋盘里放置8个皇后,要求这8个皇后两两之间互相都不“冲突”。

相关文档
最新文档