题库链接
1.买蛋糕
(1)题目分析
背景描述:客户要买特定重量的蛋糕,并且这个重量是考好的最重和最轻的。
输入:每天能考的蛋糕数n,已经考好的蛋糕数m,顾客要求的蛋糕质量a,b,已经烤好的蛋糕质量。
输出:小团能否满足顾客需求。
问题类型:多条件判断问题;元素排序问题
(2)步骤
a.读取输入数据n,m,a,b;
b.读取m个值;
c.将m个值排序
d.将m个值的两端值与a,b进行比较
情况一:最大或最小值不在[b,a]中,wrong;
情况二:最大最小值在[b,a]之中,添加a,b通过数组长度来判断是否符合要求
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//题目中貌似默认n >= 2,m <= n;
int main(){
int n = 0;
int m = 0;
int a = 0 ;
int b = 0;
//先完成数据的输入输出
while(cin>>n>>m>>a>>b){
//对不保证a,b大小的处理,s使a是最小值,b是最大值
if(a<b){
swap(a,b);
}
//定义一个容器,并用已经烤好蛋糕的值对其进行初始化
vector<int> weight(m,0);
for(int i=0;i<m;i++){
cin>>weight[i];
}
//对容器中的元素进行排序
sort(weight.begin(),weight.end());
if(weight[0]<b||weight.back()>a){
cout<<"NO"<<endl;
}
if(weight[0]!=b){
weight.insert(weight.begin(),b);
}
if(weight.back()!=a){
weight.insert(weight.end(),a);
}
if(weight.size()>n){
cout<<"NO"<<endl;
}else{
cout<<"YES"<<endl;
}
return 0;
}
}
2.综艺节目策划
(1)题目分析
背景描述:设计晋级规则,游戏环节中每个人最后都会得到一个分数score_i,
输入:参加本环节的人数n,和计划晋级的人数x
输出:实际晋级人数
(2)代码实现
步骤
a.定义输入输出变量
b.对数组进行排序
c.对数组进行遍历,统计晋级人数
#include<bits/stdc++.h>
using namespace std;
//一个比较大小的子函数,在排序算法里使用
int cmp(int a,int b)
{
return a>b;
}
int main()
{
//n为实际人数,x为计划晋级人数,ps为最后通过的人数
int n,x,ps=0;
cin>>n>>x;
//定义一个数组记录每个的得分情况
int arr[n];
for(int i=0;i<n;i++)cin>>arr[i];
//对数组中的元素进行排序
sort(arr,arr+n,cmp);
//遍历数组统计晋级人数
for(int i=0;i<n;i++)
{ //if(ps==x) break;
if((arr[i]>=arr[x-1])&&(arr[i]!=0)) ps++;
}
cout<<ps<<endl;
3.吃寿司
(1)题目分析
背景描述:N盘寿司围成一圈,每盘寿司对应一个喜好值,选择连续若干盘寿司,使得美味值最大。
输入:N,A[i]寿司数量和每盘寿司的喜好值;T表示输出数据组数
输出:美味值的最大和
问题类型:环形数组中,求子数组的最大和问题
参考链接
主要理解点:最大数组不包含两端,则为常规数组最大子序列和;如果数组包含两端,则最小序列和不包含两端,用数组总和-最小子序列和。
(2)步骤
a.定义变量,读取输入数据
b.动态归化求解普通数组中的最大子序列和以及最小子序列和问题
c.遍历数组的同时求整个数组的和
d.最终结果为普通数组中最大子序列和以及整个数组和-最小子序列和的问题
#include <bits/stdc++.h>
using namespace std;
int main(){
int T,N;
cin>>T;
for(int i=0;i<T;i++){
cin>>N;
int Max=INT_MIN,Min=INT_MAX,res;
vector<int> arr(N);
for(int i=0;i<N;i++){
cin>>arr[i];
}
int total=0;
vector<int>dpMax(N);
vector<int>dpMin(N);
dpMax[0]=dpMin[0]=arr[0];
total+=arr[0];
//分析,最大值为单个序列最大或是首尾相连(总和减去最小值),取两者最大
for(int i=1;i<N;i++){
total+=arr[i];
dpMax[i]=max(dpMax[i-1]+arr[i],arr[i]);
dpMin[i]=min(dpMin[i-1]+arr[i],arr[i]);
if(Max<dpMax[i]) Max=dpMax[i];
if(Min>dpMin[i]) Min=dpMin[i];
}
res = max(Max,total-Min);
cout<<res<<endl;
}
return 0;
}