2014 10 17 S21393 徐瑞隆 补题报告

一 题目报告

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;
} 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值