CSP-X 复赛模拟题1 吕亚亚补提报告


    1.第一题:   爬楼梯
    我的代码:错在最后结果没加1
    思路倒是没啥big问题:
    2.题目分析:
            (注意:x指的是爬半层楼)
     题目描述

小可和达达不打算坐电梯,于是他们打算爬楼梯爬上来!小可和达达从第一层出发,小可记录了每一步迈出去的距离能够跨越多少个台阶,达达记录了迈多少个台阶能够到达下一个平台。

和很多大楼类似,每次爬楼梯到达一个平台,就需要转身再爬,到达两个平台代表上了一层楼。

请你计算一下,现在小可和达达已经到达了多少层!例如小可到了第八层,然后又向上爬了若干台阶,但是没有到第九层,那么输出第八层。
    

        简单点来说:上一层平台x层 ,小可每次上ai层,求他最终在第几层上(注意:如果没上到第n层,就输出n-1层) 

           我的思路: 把ai累加起来,如果到了一个平台,就把累加器清空,计数器加加。

最终输出平台数/2,也就是层数.                                                                                                                       

        说到这里,可能大家还是不知道我咋错的,所以给大家看看错误“呆蚂”  。

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	freopen("stair.in","r",stdin);
	freopen("stair.out","w",stdout);
	int a[100005],sum=0,n,h,ans=0;
	cin>>n>>h;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum+=a[i];
		if(sum>=(h*2)){
			ans+=1;
			sum-=h;	
		}
	} 
	cout<<ans;
	fclose(stdin);
	fclose(stdout);
	return 0;	
}

        //freopen这个小可爱是用来存文档的,不用管它

话不多说,不多说废话。

AC"代码":

    主函数内容:

    int n,x;
    cin>>n>>x;
    int a[10005];
    int cnt=0,sum=0;
    for(int i=1; i<=n; i++){
        cin>>a[i];
        sum+=a[i];
        if(sum>=x){
            sum=0;
            cnt++;
        }
    }
    cout<<cnt/2+1;
    return 0;

我的错因最后还要加1的原因:还要把当前层加上;

算楼层时,走了n层,那么你在n+1层上。

知识点:多数求和+思维考察+楼梯问题

2.sline    (这小破题很难)

        题目描述:这破题,就不用过多赘述了吧       return   0;              (在下面)

        思路就是:把所有的符号存进亿个小小的字符数组里然后根据上一个字母来判断存什么符号,空几个格

        比如说:(来看一组样例)abcdcc 

1.a到b,就输出一个“/”

2.c到c,就输出一个“-”

3.d到c,就输出一个“\”

最后,只要便利字符数组然后判断是否为空格

只要不为空格,输出数组元素即可

怎么样,这题是不是很简单啊

毕竟我没报0

哈哈哈哈哈

但是具体是多少分

大家自己判断,我就不告诉你;

我的错误代码就不打了

看看AC代码(在下面){

#include<iomanip>
#include<cmath>
#include<cstring>
using namespace std;
int n,m,k,h=100;
char a[205][205];
int hmin=111,hmax=0; 
string s;
int main(){
    cin>>s;
    memset(a,' ',sizeof(a));
    int len=s.size();
    for(int i=1;i<len;i++){
        if(s[i-1]<s[i]){
            if(a[h][i-1]=='-'||a[h][i-1]=='/'){
                h--;
            }
            a[h][i]='/';
        }
        else if(s[i-1]==s[i]){
            if(a[h][i-1]=='/'){
                h--;
            }    
            else if(a[h][i-1]=='\\'){
                h++;  
            }
            a[h][i]='-';
        }
        else if(s[i]<s[i-1]){
            if(a[h][i-1]=='-'||a[h][i-1]=='\\'){
                h--;
            }
            a[h][i]='\\';
        }
        hmax=max(hmax,h);
        hmin=min(hmin,h);
    }
    for(int i=hmin;i<=hmax;i++){
        for(int j=len-1;j>=1;j--){
            if(a[i][j]!=' '){
                m=j;
                break;
            }
        }
        for(int j=1;j<=m;j++){
            cout<<a[i][j];
        }
        cout<<endl;
    }
    return 0;
}

分析代码:

根据题目可知:有三种可能:要么当前自负比上一个大,要么相等,要么小。

因为要考虑换行问题,还要看上一个字符(即a[h][i-1])

这里我举一个相等的例子{若上一个为上升,则高度减减,下降则高度++

题型:字符串+二维数组

3.吉利数

题目描述:达达眼中含有4的数字是不吉利的数字,输入一个数n,请你输出第n个吉利的数字是多少

这道题看似简单但是n最大到pow(10,18),数据量很大

我的错因:数组控件有限,但数据量过大,无法存下数据

分析题目:由于数据过大,打暴力只能得60分;根据题目描述:吉利数为不含4的数字,而十个数中就有九个不含四的数字,由此不难想出,所以我们采用九进制的方法来存储数据;

题型:九进制转换+栈的运用

来看那么“亿”组样例    14

1   2    3    5    6   7   8   9   10   11 12     13   15   16

所以输出16

话不多说,上AC代码:

int main(){
    long long t;
    scanf("%lld",&t);
    while(t--){
        long long n;
        scanf("%lld",&n);
        stack<int> bing_bing;
        while(n!=0){
            int k=n%9;
            n/=9;
            if(k>=4){
                k++;
            }
            bing_bing.push(k);
        }
        while(bing_bing.empty()!=1){
            printf("%d",bing_bing.top());
            bing_bing.pop();
        }
        printf("\n");
    }
    return 0;
}

//bing_bing是个小可爱,先不用管他

4.路灯安装

暴力枚举:嵌套for*4;

对于1500的数据;

肯定会超时

所以用二分和数据关系是来解决

题型:二分答案+推导关系式

题目描述:有ABCD四盏路灯,给定要求的明亮度,请你找出一个最优方案:是路灯耗电量的总和最小

AC代码(100分的){}

bool check(int mid){
    for(int i=0;i<=a; i++){
        for(int j=0;j<=d; j++){
            int need=max(a-i-j/4,d-j-i/4);
            if((mid-i-j)/2<need) continue;
            int now=mid-i-j;
            int bneed=max(0,b-i/2-j/2); 
            int cneed=max(0,c-i/2-j/2);
            int bb=max(0,(bneed-now/4)*4/3);
            for(int k=max(0,bb-5);k<=min(now,bb+5);k++)
                if(k+(now-k)/4>=bneed&&k/4+now-k>=cneed)
                    return true;
                    
        }
    }
    return false; 
}
int main(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int l=0,r=a+b+c+d,ans=a+b+c+d;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid)) ans=mid,r=mid-1;
        else l=mid+1;
    }
    cout<<ans;
    return 0;

赛后总结:1.今天的题挺难啊

2.我脑子要废啦

欢迎大家来评论!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值