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::vector
Interval 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; // 记录当前结束时间
// 遍历排序后的intervals
for (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 ;
else
return 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";
else
cout<<"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;
}
else
cout<<"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);
else
return count(s+1,x);
}
int main()
{
char s[80],x;
cin>>s>>x;
if (check(s,x))
cout<<"YES "<<count(s,x);
else
cout<<"NO";
return 0;
}