acm入门基础题解一
清华大学ACM题解

if (k==n){ //Output permutation.
for (int i-1; i<n; i++) cout<<a[i]<<" ";
}
else //a[k:n] has more than one permutation.
// Generate these recursively.
{
int a[3] = {1, 2, 3};
Perm(a, 0, 3);
return 0;
}
该程序的运行结果为
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
那么,该函数就完成了对一个数组进行全排列的操作
下面,分析该程序,我用圆圈代表每次函数的调用
对于数据的输入和输出有几道练习题
/showproblem.php?pid=1089
至
/showproblem.php?pid=1096
二、算法基础
1. 什么是算法
算法是完成特定任务的有限指令集。所有的算法必须满足下面的标准:
编辑源文件
能够提共管理程序开发的所有步骤,包括编辑的程序成为集成开发环境(integrated development evironments, IDE)。在windows系统下,使用较为广泛的有Microsoft Visual C++、Dev-Cpp等,在UNIX系统下,有Vim、emacs、eclipes等。这些程序都能提供一个较好的开发平台,使我们能够方便的开发一个程序,接下我们所要了解的都是标准C++,所有源代码都在Dev-cpp下编写,能够编译通过。
ACM试题及参考答案

1. 给定一个矩阵M(X, Y),列集为X ,行集为Y 。
如果存在对其列的一个排序,使得每一行的元素都严格递增,称M 是一个次序保持矩阵。
例如下图中存在一个排序x 4,x 1,x 2,x 3,x 5I ⊆X ,满足:子矩阵M(I,Y)是次序保持矩阵。
[测试数据] 矩阵M :[测试数据结果] I={ x 1,x 3,x 4,x 7,x 8}[解题思路] 将该问题归约为在一个有向图中找一条最长路径的问题。
给定矩阵M=(a ij ),行集Y ,列集X ,行子集J ⊆Y ,定义有向图D A =(V A ,E A ),其中V A 含有|X|个顶点,每个顶点代表X 中的一列,如果顶点u ,v 对应的列x u ,x v 满足,对于任意的j ∈J ,u v ij ij a a <,则有一条从u 到v 的弧(u ,v )∈E 。
显然,D A 是个无环图,可以在O(|X|2)时间内构造完毕。
对于任意的条件子集J ,A(I,J)是次序保持的当且仅当对应于J 中条件的顶点在D A 中构成一条有向路径。
从而我们只需在有向图D A 中找一条最长路径,该问题可在O(|V A |+| E A |)时间内完成。
按上面的方法构造有向图如下:有向图中找最长路径的线性时间算法。
一些表示方法如下:d out (u )为顶点u 的出度,d in (u )为顶点u 的入度,source 为入度为0的顶点,sink 为出度为0的顶点,N out (u )为u 指向的邻接点集合,P uv 为从u 到v 的最长路,显然应从source 到sink 。
在每一步为每个顶点关联一个永久的或临时的标签。
v被赋了一个临时标签(v’,i v)表明在当前步,算法找出的最长的从source到v的有向路长度为i v,且经由v’而来。
v被赋了一个永久标签[v’,i v]表明从source到v的最长有向路长度为i v,且经由v’而来,通过回溯每个顶点的永久标签就可以找出最长有向路。
c acm试题及答案

c acm试题及答案ACM(Association for Computing Machinery)是计算机科学领域的国际性学术组织,旨在推动计算机科学的发展与研究。
ACM竞赛是ACM组织举办的一项计算机算法编程竞赛,每年都有数以千计的计算机专业学生参加。
这篇文章将介绍一道ACM试题,并提供解答。
题目描述:给定一个整数数组nums,其中所有元素都是非负整数,现在要求你计算nums中连续子数组的最大和,并输出该最大和。
输入:第一行输入一个整数n,表示数组长度(1 <= n <= 10^5)。
第二行输入n个整数,表示数组nums的元素(元素范围为0 <= nums[i] <= 100)。
输出:输出一个整数,表示nums中连续子数组的最大和。
示例:输入:51 2 3 4 5输出:15解释:最大和子数组为[1, 2, 3, 4, 5],和为15。
解答:首先,我们可以使用一个变量maxSum来记录当前得到的最大和,初始化为0。
同时,我们还使用一个变量sum来记录当前连续子数组的和,初始化为0。
接下来,我们对数组nums进行遍历。
对于每一个元素nums[i],我们将其加到sum中,并判断sum是否大于0。
如果sum大于0,说明当前连续子数组的和对后面的结果是有正向贡献的,我们可以继续累加后面的元素。
如果sum小于等于0,说明当前连续子数组的和对后面的结果没有正向贡献,我们可以将sum重新置为0,重新开始计算连续子数组的和。
在遍历过程中,我们不断更新maxSum的值,保证其为当前得到的最大和。
最终,遍历结束后的maxSum即为所求的最大和。
下面是具体的实现代码:```cpp#include <iostream>#include <vector>#include <algorithm>using namespace std;int maxSubArray(vector<int>& nums) { int maxSum = 0;int sum = 0;for(int i = 0; i < nums.size(); i++) { sum += nums[i];if(sum > maxSum) {maxSum = sum;}if(sum <= 0) {sum = 0;}}return maxSum;}int main() {int n;cin >> n;vector<int> nums(n);for(int i = 0; i < n; i++) {cin >> nums[i];}int result = maxSubArray(nums);cout << result << endl;return 0;}```以上就是解答c acm试题并提供相应代码的文章。
ACM初步题及题解-推荐下载

最新acm入门简单数学题(精品ppt课件

06.01.2021
28
请自己仔细分析...
哪位同学做个陈述?
06.01.2021
29
课后任务:
完成在线练习:
201309《ACM程序设计》作业(2)—— 刘春英 老师
特别提醒:
作业务必尽力完成(第一次的作 业尚未完成的,一定要补上~)
作业密码:helloworld
06.01.2021
30
Welcome to HDOJ
Thank You ~
06.01.2021
31
公民反恐防范知识宣 资料
(宜宾市反恐办宣)
1.如何识别恐怖嫌疑人员?
• (1)神情慌张,言行异常者; • (2)着装、携带物品与其身份明显不符,服装奇异; • (3)携带有管制刀具、斧头以及类似爆炸物等危险物品 • (4)频繁进出大型活动场所,反复在商场、医院、车站
ACM入门简单数学题(精品)
今天,
你 了吗?
06.01.2021
2
很常见的一种写法:
#include<stdio.h>
int main()
{ int n, i, sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
sum=sum+i;
printf("%d\n",sum);
}
06.01.2021
23
HDOJ_1005: Number Sequence
06.01.2021
24
Question:
暴力(Brute-Force) 能解决问题吗?
acm大学生程序设计试题

acm大学生程序设计试题题目一:最大公约数(GCD)题目描述:给定两个正整数,求它们的最大公约数(GCD)。
输入两个正整数a和b(1 <= a, b <= 10^9),求它们的最大公约数。
输入格式:两个正整数,以空格分隔。
输出格式:输出一个整数,表示输入两个正整数的最大公约数。
示例:输入:14 21输出:7思路和分析:最大公约数(GCD)可以使用欧几里得算法来求解,即辗转相除法。
具体的步骤如下:1. 用较大的数除以较小的数,将得到的余数作为新的较大数。
2. 再用新的较大数除以较小数,将得到的余数作为新的较大数。
3. 如此重复,直到两个数可以整除,此时较小的数就是最大公约数。
代码实现:```cpp#include <iostream>using namespace std;int gcd(int a, int b) {if (b == 0)return a;return gcd(b, a % b);}int main() {int a, b;cin >> a >> b;int result = gcd(a, b);cout << result << endl;return 0;}```题目二:字符串反转题目描述:给定一个字符串,要求将其反转并输出。
输入一个字符串s(1 <= |s| <= 1000),输出该字符串的反转结果。
输入格式:一个字符串s,只包含大小写字母和数字。
输出格式:一个字符串,表示输入字符串的反转结果。
示例:输入:HelloWorld123输出:321dlroWolleH思路和分析:字符串反转可以使用双指针的方法来实现。
初始时,左指针指向字符串的开头,右指针指向字符串的末尾,然后交换左右指针所指向的字符,并向中间移动,直到左指针不小于右指针。
代码实现:```cpp#include <iostream>using namespace std;string reverseString(string s) {int left = 0, right = s.length() - 1; while (left < right) {swap(s[left], s[right]);left++;right--;}return s;}int main() {string s;cin >> s;string result = reverseString(s); cout << result << endl;return 0;}```题目三:字符串匹配题目描述:给定一个字符串s和一个模式串p,判断s中是否存在与p相匹配的子串。
acm基础试题及答案

acm基础试题及答案ACM基础试题及答案1. 以下哪个选项是C语言中正确的字符串声明方式?A. char str[] = "Hello World";B. char str[10] = "Hello World";C. string str = "Hello World";D. char str = "Hello World";答案:A2. 在C++中,以下哪个关键字用于定义类的私有成员?A. publicB. privateC. protectedD. static答案:B3. 以下哪个数据结构允许快速随机访问元素?A. 链表B. 队列C. 数组D. 栈答案:C4. 在Python中,以下哪个函数用于将列表中的元素连接成一个字符串?A. join()B. concat()C. append()D. merge()答案:A5. 在数据库管理系统中,SQL代表什么?A. Structured Query LanguageB. Standard Query LanguageC. Simple Query LanguageD. System Query Language答案:A6. 在HTML中,用于定义最重要的标题的标签是什么?A. <h1>B. <title>C. <header>D. <h6>答案:A7. 在JavaScript中,以下哪个方法用于将字符串转换为小写?A. toUpperCase()B. toLowerCase()C. toUpperCase()D. toCamelCase()答案:B8. 在Unix/Linux系统中,哪个命令用于查看当前目录下的文件和文件夹?A. lsB. pwdC. cdD. mkdir答案:A9. 在C语言中,以下哪个函数用于计算数组中元素的总和?A. sum()B. count()C. sizeof()D. memset()答案:A10. 在Java中,以下哪个关键字用于创建单例模式?A. staticB. finalC. synchronizedD. volatile答案:A。
ACM入门试题Problem_Set

A : 赶公交Alfred在大学新区上学,他每个星期都要到市区学琴,因此要在每个星期六的10点钟之前赶到琴行上课,从郑大坐68路车到琴行要花整整一个小时,而68路车是每半小时一趟,整点和30分的时候会发一趟车。
这一次,Alfred起床晚了,一看表已经8点多了,匆忙收拾了一下之后,Alfred马上冲向公交站,但是,由于路况不佳,在前面的一段路上满是泥泞。
路况如下:如左图,A(x A,y A)是Alfred现在所处的位置,B(x B,y B)是公交站(Bus-stop)的位置,其中y>0的区域是泥泞的地面,Alfred在泥泞的地面上的移动速度是v1(米/秒),而y<0的区域是水泥地,Alfred在水泥地上的移动速度只有v2(米/秒),其中v1<=v2,A在第二象限,B在第四象限。
Alfred是一个物工院的学生,他稍微估算了一下,剩下的时间已经不多了,他看看表,现在离9点整只剩下T秒了(T由题目给出),Alfred想知道,他如果用最优的策略赶往公交站,今天的课是否会迟到。
输入规格:第一行是一个整数C,C<=10,紧接着C组数据,每组数据依次给出x A,y A,x B,y B,v1,v2和T,他们的意义如上文所述,x,y坐标的单位是米,所有坐标的绝对值<109,T是一个整数。
输出规格:对于每组数据,输出YES或NO,表示Alfred会不会迟到。
输入样例:3-10.0 10.0 10.0 -10.05.0 5.06-10.0 10.0 10.0 -10.0 5.0 5.0 5-10.0 10.0 10.0 -10.0 5.0 3.08输出样例:YESNOYESps:三个样例中实际所需的最短时间依次是:5.66, 5.66, 7.33出题者:黄文超B : 逃学威龙fish_ball无心向学,总是打逃课的主意,他确信他的期末考试绝对能够考过,但是老师可不相信他,因此老师定下了一条规矩,最后的期末成绩将由平时成绩和考试成绩组成,各占50%的分数,也就是满分100分,其中平时成绩50分,考试成绩50分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Problem A: 数字三角形#include<stdio.h>#include<stdlib.h>constintmaxn=110;int a[maxn][maxn],b[maxn][maxn],n; voiddata_set(){for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){scanf("%d",&a[i][j]);}}}void solve(){for(int j=1;j<=n;j++)b[n][j]=a[n][j];for(int i=n-1;i>=1;i--)for(int j=1;j<=i;j++){if(b[i+1][j+1]>b[i+1][j])b[i][j]=b[i+1][j+1]+a[i][j];elseb[i][j]=b[i+1][j]+a[i][j];}printf("%d\n",b[1][1]);}int main(){while(scanf("%d",&n)!=EOF&&n!=0){data_set();solve();}return 0;}Problem B: 去北京看奥运#include<stdio.h>#include<string.h>constintmaxn=110;constintinf=200000000;int a[maxn],b[maxn][maxn],dp[maxn][maxn],n; voiddata_set(){for(int j=0;j<maxn;j++)for(int k=0;k<maxn;k++)dp[k][j]=inf;dp[0][1]=0;ints,e,l;scanf("%d",&n);a[0]=1;a[n+1]=1;for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=0;i<=n;i++){for(int j=1;j<maxn;j++)for(int k=1;k<maxn;k++)b[k][j]=inf;while(1){scanf("%d",&s);if(s==0) break;scanf("%d%d",&e,&l);b[s][e]=l;}for(int j=1;j<=a[i+1];j++){for(int k=1;k<=a[i];k++){if(dp[i+1][j]>dp[i][k]+b[k][j]&&b[k][j]!=inf) dp[i+1][j]=dp[i][k]+b[k][j];}}}printf("%d\n",dp[n+1][1]);}int main(void){int t;scanf("%d",&t);while(t--)data_set();}Problem C: 计算直线的交点数#include <iostream>#include <set>using namespace std;int main(){intn,tmp;set<int> s[21];s[0].insert(0);s[1].insert(0);for(int i=2;i<21;i++){for(int j=0;j<i;j++){set<int>::iterator it;for(it=s[j].begin();it!=s[j].end();it++){tmp=*it+(i-j)*j;s[i].insert(tmp);}}}while(cin>>n){set<int>::iterator it;for(it=s[n].begin();it!=s[n].end();it++){if(it!=s[n].begin()) cout<<" ";cout<<*it;}cout<<endl;}}Problem D: 免费馅饼#include<stdio.h>#include<string.h>int a[100050][11];int main(){int i, j, n, p, q, x, m;while(scanf("%d", &n)!=EOF){if(n==0) break;m=0;memset(a, 0, sizeof(a));for(i=1;i<=n;i++){scanf("%d%d", &q, &p);a[p][q]++;if(p>m) m=p;}for(i=m;i>=0;i--){for(j=0;j<11;j++){int x=a[i+1][j];if(j>0&&a[i+1][j-1]>x) x=a[i+1][j-1]; if(j<10&&a[i+1][j+1]>x) x=a[i+1][j+1]; a[i][j]+=x;}}printf("%d\n", a[0][5]);}return 0;}Problem E: 地道战#include<stdio.h>#include<string.h>constintmaxn=110;constintinf=200000000;intn,m,a[maxn][maxn],r[maxn][maxn],d[maxn][maxn]; int min(inta,int b){return a<b?a:b;}voiddata_set(){for(int i=1;i<=n;i++)for(int j=1;j<m;j++)scanf("%d",&r[i][j]);for(int i=1;i<=m;i++)for(int j=1;j<n;j++)scanf("%d",&d[j][i]);for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)a[i][j]=inf;}void solve(){a[1][1]=0;for(int i=2;i<=m;i++) a[1][i]=a[1][i-1]+r[1][i-1];for(int i=2;i<=n;i++) a[i][1]=a[i-1][1]+d[i-1][1];for(int i=2;i<=n;i++){for(int j=2;j<=m;j++){a[i][j]=min(a[i][j-1]+r[i][j-1],a[i-1][j]+d[i-1][j]);}}printf("%d\n",a[n][m]);}int main(){while(scanf("%d%d",&n,&m)!=EOF){data_set();solve();}}Problem F: 最长不下降序列#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;constintmaxn=2000;inti,j,n,t,x,lmax,a[maxn],b[maxn];int main(){int max;while(scanf("%d",&n)!=EOF){for(i=1;i<=n;i++)cin>>a[i];b[n]=1;lmax=0;for(i=n-1;i>=1;i--){max=0;for(j=i+1;j<=n;j++)if(a[i]<=a[j]&&b[j]>max)max=b[j];b[i]=max+1;if(b[i]>lmax) lmax=b[i];}cout<<lmax<<endl;}return 0;}Problem A: Substrings#include<iostream>#include<algorithm>#include<string>using namespace std;bool comp(string str1,string str2){ return str1.length()<str2.length(); }stringstr[112];int main(){int t;cin>>t;while(t--){int n;cin>>n;int i=0;for(i=0;i<n;i++)cin>>str[i];sort(str,str+n,comp);string::iterator p1;string::iterator p2;string::iterator p0; intans=0,max=0;for(p1=str[0].begin();p1<str[0].end();p1++) for(p2=str[0].end()-1;p2>=p1;p2--){string ss1=str[0].substr(p1-str[0].begin(),p2-p1+1); string ss2;for(string::iterator it=p2;it>=p1;it--){ss2+=*it;}ans=ss1.length();int flag=1;for(i=1;i<n;i++){int x=str[i].find(ss1);int y=str[i].find(ss2);if(x==-1&&y==-1){flag=0;break;}}if(flag==1&&max<=ans)max=ans;}cout<<max<<endl;}return 0;}ProblemB:CallingExtraterrestrialIntelligcn#include<cstdio>#include<iostream>#include<cstring>#define N 100005using namespace std;boolno_prim[N];intm,a,b,p,q;voidprimetable(){inti,j;for(i=3;i<317;i+=2){if(no_prim[i]==false){inttmp=i<<1;for(j=i*i;j<N;j+=tmp)no_prim[j]=true;}}}int main(){inti,j;primetable();while(scanf("%d%d%d",&m,&a,&b)&&m&&a&&b){p=q=0;double limit=a*1.0/b;for(i=2;i<=m;i++){if(!no_prim[i]&&i%2!=0||i==2){for(j=2;j<=i&&i*j<=m;j++){if(!no_prim[j]&&j%2!=0||j==2){if(j*1.0/i>=limit&&i*j>p*q) //i和j的顺序{p=j;q=i;}}}}}printf("%d %d\n",p,q);}return 0;}Problem C: 深入浅出学算法028-桥本分数式#include <stdio.h>int main(){inti,k,g,s;int m1,m2,m3,a[10];a[1]=1;i=1;g=1;s=0;while(1){g=1;for(k=i-1;k>0;k--)if(a[k]==a[i]) {g=0; break;}if(i==9 && g==1 && a[1]<a[4]){m1=a[2]*10+a[3];m2=a[5]*10+a[6];m3=a[8]*10+a[9];if(a[1]*m2*m3+a[4]*m1*m3==a[7]*m1*m2){s++;}}if(i<9 &&g==1){i++; a[i]=1; continue;}while(a[i]==9 && i>1) i--;if(a[i]==9 && i==1) break;else a[i]++;}printf("%d\n",s);}Problem D: 深入浅出学算法029-素数和环#include<stdio.h>#include<math.h>int main(){intt,i,j,n,k,s,a[2000],b[1000]; while(~scanf("%d",&n)){for(k=1;k<=2*n;k++) b[k]=0; for(k=3;k<=2*n;k+=2){for(t=0,j=3;j<=sqrt(k);j+=2)if(k%j==0){t=1;break;}if(t==0) b[k]=1;}a[1]=1;s=0;i=2;a[i]=2;while(1){t=1;for(j=1;j<i;j++)if(a[j]==a[i] || b[a[i]+a[i-1]]!=1){t=0;break;}if(t && i==n && b[a[n]+1]==1){s++;}if(t && i<n) {i++;a[i]=2;continue;} while(a[i]==n) i--;if(i>1) a[i]++;else break;}printf("%d\n",s);}return 0;}。