一 题目报告
T1 逃离 0分
T2 晾腊肉 10分
T3 删除 0分
T4 手工课 20分
二 题目大意及解析
T1.逃离
问题描述:
小可逃离战争封锁地的过程中,邪恶军团又发射了导弹袭击!好在小可身处群山之中,群山的山峰可以在一定程度上抵挡导弹的攻击。小可提前知道了导弹的高度和山峰的侧视高度图,小可想知道导弹会命中哪座山峰。如果导弹会袭击到小可输出 danger ,注意:从左到右第一个大于等于导弹高度的山峰会被命中。
题目思路:
1.先定义一个char类型的数组,然后输入,持续判断高度是否大于等于山峰的高度,如果成立就输出高度,到了最后没有碰到的话就输出danger来表示会被攻击。
题目正解:
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main(){
// freopen("water.in","r",stdin);
// freopen("water.out","w",stdout);
string s;
int b[105]={0};
int n,m,k;
cin>>n>>m>>k;
getchar();
for(int i=1;i<=n;i++){
getline(cin,s);
for(int j=0;j<=s.size()-1;j++){
if(s[j]=='*'){
b[j+1]++;
}
}
}
for(int i=1;i<=m;i++){
if(b[i]>=k){
cout<<i;
return 0;
}
}
cout<<"danger";
// fclose(stdin);
// fclose(stdout);
return 0;
}
错误原因:
没有考虑到要从第一列开始输入和遍历,考虑不全面。
T2.晾腊肉
问题描述:
小可奶奶晾晒出来的腊肉味道是一绝!今年又到了晾晒腊肉的时候,奶奶早早开始准备。小可的奶奶先拿出来了n个架子,然后每个架子的高度为a,架子用来晾晒腊肉。已知n总共有 块腊肉,每块腊肉的大小为b。腊肉会放在架子上,并且需要架子的高度大于等于腊肉的大小时,腊肉才不会触碰到地上。小可主动的要帮助奶奶进行腊肉和架子之间的配对,使得更多的腊肉不会触碰到地上。
求最多能有多少腊肉不会触碰到地上。
题目思路:
1.使用先排序在双指针查找遍历的方法来进行比较,如果可以就计数器加一,否则就移动指针。
题目正解:
#include<bits/stdc++.h>
using namespace std;
int main(){
// freopen("water.in","r",stdin);
// freopen("water.out","w",stdout);
int n,a[1000005],b[1000005],sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],b+i);
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
int i=1,j=1;
while(i<=n){
if(a[i]>=b[j]){
j++,i++,sum++;
}
else{
i++;
}
}
printf("%d",sum);
// fclose(stdin);
// fclose(stdout);
return 0;
}
T3.删除
问题描述:
删、删、删,用力的删除!序列太长了, 小可阅读的时候就非常麻烦!因此,小可要删除序列中一些数字!具体地:有一个长度为n的序列 ,小可要删除其中a个数字。但是随机删除有点太难了,因此小可规定:每次只能删除数组中第一个位置元素,或者最后一个位置的元素。当删除完k个元素后,请你求一下最大的数组的和。
题目思路:
1.可以直接使用暴力解法,将题目转换成求连续数字的最大值,就很好解决了。
题目正解:
#include<bits/stdc++.h>
using namespace std;
int main(){
// freopen("water.in","r",stdin);
// freopen("water.out","w",stdout);
int a[5005],n,k;
long long s[5005];
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
k=n-k;
long long sum=0,t;
for(int i=k;i<=n;i++){
t=s[i]-s[i-k];
sum=max(sum,t);
}
cout<<sum;
// fclose(stdin);
// fclose(stdout);
return 0;
}
T4.手工课
问题描述:
达达老师是一位和蔼亲切的手工老师。今天就由达达老师带领同学们在手工课制作一些好玩的东西吧。在手工课开始前,达达老师就为同学们准备了 根长度均为 的手工材料。班级里共有 位同学,每位同学也同样准备了手工材料,已知,第 同学准备的材料长度为 。手工作品最终完成后,要送给 位受人尊敬的老师,每位老师需要的手工作品高度需要是 。注意:为了方便,假设手工材料可以制作出等高度的手工作品。为了满足老师们对手工作品高度的要求,老师会与学生把某些材料切成两段,并留下需要的那一段,此时另一段成为边角料,不可以再继续使用。现在,达达老师想要知道现有的手工材料能否满足所有的要求,若是满足,请输出需要使用的最小的的材料长度之和。
注意:如果一个材料被切成了两段,成为边角料的那一段也属于需要使用的材料。
题目思路:
1.可以借助上题的思路,先排序,然后再进行一一对应的方法,最后累加器输出,就可以了
题目正解:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,u,k,m,a[2*N],b[N];
long long sum=0;
int main(){
// freopen("water.in","r",stdin);
// freopen("water.out","w",stdout);
cin>>n>>u>>k>>m;
for(int i=1;i<=k;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
a[++k]=u;
}
sort(a+1,a+1+k);
sort(b+1,b+1+m);
int i=1,j=1;
while(b[j]==0 && j<=m){
j++;
}
while(i<=k && j<=m){
if(b[j]<=a[i]){
sum+=a[i];
j++,i++;
}
else{
i++;
}
}
if(j<=m){
cout<<"No";
}
else{
cout<<"Yes"<<endl<<sum;
}
// fclose(stdin);
// fclose(stdout);
return 0;
}