T1、给定由n个整数(可能为负数)组成的序列a1,a2,...,an,求该序列子段和的最大值。当所有整数均为负数时,其最大子段和为0。
【输入】
第一行一个整数,表示n的值, 1<=n<=100;
第二行n个整数,表示a1,a2,...,an的值。
【输出】
一个整数,表示最大子段和
【输入样例】
6
-2 11 -4 13 -5 -2
【输出样例】
20
#include<bits/stdc++.h>
using namespace std;
int n;
const int mx=101;
int a[mx];
int ans,t;
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];t=0;ans=0;for(int i=1;i<=n;i++){if(t<0)t=a[i];else t+=a[i];if(ans<t)ans=t;}cout<<ans<<endl;return 0;
}
T2、某体育馆有一羽毛球场出租,现在总共有n位客户申请租用此羽毛球场,每个客户i所租用的时间为[s(i),f(i)),其中s(i)表示开始租用时刻,f(i)表示结束租用时刻。同一时刻该羽毛球场只能租借给一位客户,体育馆最多能够满足多少位客户的需求?
【输入】
第一行一个整数 ,表示n 的值,1<=n<=100;
下面n行,每行二个整数,分别表示每个客户租用的开始时刻和结束时刻。
【输出】
一个整数,表示最多能够满足的客户数量。
【输入样例】
3
5 8
1 6
7 10
【输出样例】
2
#include <iostream>
#include <algorithm> // 用来排序using namespace std;// 定义一个结构体来存储开始时间和结束时间
struct Interval {int start, end;
};// 比较函数,用来按照结束时间排序
bool compare(const Interval &a, const Interval &b) {return a.end < b.end;
}int main() {int n;cin >> n;// 使用结构体数组代替std::vectorInterval intervals[n];// 读取输入并存储到intervals中for (int i = 0; i < n; ++i) {cin >> intervals[i].start >> intervals[i].end;}// 按照结束时间对intervals进行排序sort(intervals, intervals + n, compare);// 打印排序后的数组for (int i = 0; i < n; i++) {cout << intervals[i].start << " " << intervals[i].end << endl;}int count = 0; // 记录满足的客户数量int end = -1; // 记录当前结束时间// 遍历排序后的intervalsfor (int i = 0; i < n; ++i) {if (intervals[i].start >= end) {// 如果当前区间的开始时间大于等于上一个区间的结束时间,则可以安排count++;end = intervals[i].end; // 更新当前结束时间}}// 输出最多能够满足的客户数量cout << count << endl;return 0;
}
T3、某码头需要将n个集装箱装上一艘载重为C的轮船,其中集装箱i的重量为wi(0<=i<=n-1)。最佳装载问题是指在装载体积不受限的情况下,使得装箱数目最多的装载方案。
【输入】
第一行二个整数,表示n 和 C 的值,1<=n<=50, 1<=C<=1000。
第二行n个整数,分别表示集装箱的重量。
【输出】
一个整数,表示最多装箱数目。
【输入样例】
5 10
3 8 1 5 7
【输出样例】
3
#include<bits/stdc++.h>
using namespace std;
int n,C;
const int mx=51;
int w[mx];int main(){cin>>n>>C;for(int i=0;i<n;i++){cin>>w[i];}int dp[C+1]={0};//外层循环遍历每个物品for(int i=0;i<n;i++){//内层循环从C开始递减到物品的重量w[i]。 for(int j=C;j>=w[i];j--){// 如果当前集装箱的重量w[i]<=当前载重j,则考虑是否选择它//如果选择当前物品(即重量为w[i]的物品),//则计算1 + dp[j - w[i]](表示选择这个物品后剩余载重j - w[i]能装箱的最大数量),//并将其与dp[j](不选择这个物品时的最大数量)进行比较,//取较大值作为新的dp[j]。dp[j]=max(dp[j],1+dp[j-w[i]]);}}cout<<dp[C]<<endl;return 0;
}
T4、给定含有 n 个不同的数的数组 L = 〈x1, x2, . . . , xn〉. 如果 L 中存在 x, 使得 x1 <x2 < · · · < xi−1 < xi > xi+1 > · · · > xn, 则称 L 是单峰的, 并称 xi 是 L 的 “峰顶”. 假设L 是单峰的, 设计一个算法找到 L 的峰顶. 如果这些数中存在峰顶元素xi,则输出该元素的下标i,否则输出0.
#include<iostream>using namespace std;int mounton(int n, int a[], int* abs){int i = 0, j = n - 1;while (i < j){if (a[i + 1] >= a[i]) i++;else if (a[j - 1] >= a[j]) j--;else break;}if (i == 0 || j == n - 1 || i < j){(*abs) = 0;}else if (i == j) (*abs) = i;return 1;}int main(){int n, abs = 0;cin >> n;int a[10000];for (int i = 0; i < n; i++){cin >> a[i];}mounton(n, a, &abs);if (abs != 0) cout << abs + 1;else cout << abs;}
T5、在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
#include<iostream>using namespace std;void fun(int n, int a[], int* sum){for (int i = 0; i < n; i++){for (int j = i + 1; j < n; j++){if(a[i]>a[j]) (*sum)++;}}}int main(){int n=0,sum=0;int a[10000];cin >> n;for (int i = 0; i < n; i++){cin >> a[i];}fun(n, a, &sum);cout << sum;}
T6、设计一个递归算法和一个迭代算法计算二项式系数:
输入:n m
输出:二项式系数
例:
输入:10 3
输出:120
#include<bits/stdc++.h>using namespace std;int C1(int m, int n) //递归{if (m>n-m) m=n-m;if (m==0) return 1 ;elsereturn C1(m,n-1)+C1(m-1,n-1);}int C2(int m, int n) //迭代{if (m>n-m ) m=n-m ;int *fac=new int [n+1]; //fac[]存储所有不超过n的阶乘fac[0]=1;for (int i=1;i<=n;i++)fac[i]=i*fac[i-1];int res=fac[n]/fac[m]/fac[n-m];delete[] fac;return res;}int main(){int m,n;cin>>n>>m;cout<<C1(m,n);//cout<<C2(m,n);return 0;}
#include<iostream>using namespace std;long long fun(long long,long long);int main(){long long n,m;cin>>n>>m;cout<<fun(n,m);return 0;}long long fun(long long n,long long m){if(m==n||m==0) return 1;else return fun(n-1,m-1)+fun(n-1,m);}
T7、设计一个递归算法判断给定的字符串是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。
输入:字符串(一行,不超过80个字符)。
输出:YES或NO
例:
输入:XYZYX
输出:YES
#include<bits/stdc++.h>
using namespace std;
int huiwen(char* str,int len){if(len==0||len==1)return 1;if(str[0]!=str[len-1])return 0;return huiwen(str+1,len-2);
}int main(){char s[80];cin>>s;if (huiwen(s,strlen(s))) cout<<"YES";else cout<<"NO";return 0;
}
#include<iostream>#include<string.h>using namespace std;bool fun(string s,int start,int end){if(start>=end) return true;else return s[start]==s[end] && fun(s,start+1,end-1);}int main(){string s;cin>>s;if(fun(s,0,s.size()-1))cout<<"YES";elsecout<<"NO";return 0;}
T8、给定一个英文字母字符和数字字符组成的字符串s和一个字母或数字字符x,编写递归算法实现:(1)检查x是否在s中。(2)计算x在s中出现的次数。
输入:字符串s 字符x
输出:YES 出现次数 (出现时)
NO (不出现时)
例:
输入:XYXZZZY Z
输出:YES 3
#include<iostream>#include<string.h>using namespace std;int fun(char *p,char x){int count=0;if(*p){if((*p)==x)count++;count+=fun(p+1,x);}return count;}int main(){char s[10000];cin>>s;char x;cin>>x;int cou=fun(s,x);if(0!=cou){cout<<"YES "<<cou;}elsecout<<"NO";return 0;}
#include<bits/stdc++.h>using namespace std;int check(char* s,char x){if (*s=='\0')return 0;if (*s==x)return 1;return check(s+1,x); }int count(char *s,char x){if (*s=='\0')return 0;if (*s==x)return 1+count(s+1,x);elsereturn count(s+1,x);}int main(){char s[80],x;cin>>s>>x;if (check(s,x))cout<<"YES "<<count(s,x);elsecout<<"NO";return 0;}