CSP-X复赛模拟一补题报告

一:
T1:【爬楼梯】
T2:【字符折线图】
T3:【吉利数】
T4:【路灯照明】

二,比赛过程:

一开始没把握好时间,在第二道题上耽误的时间太多了,时间不够用了,

没写完呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

三比赛分解:

第一题:

                                         爬楼梯


                                                           (stair.cpp/c)

问题描述
小可和达达不打算坐电梯,于是他们打算爬楼梯爬上来!小可和达达从第一层出发,小可记录了每一步迈出去的距离能够跨越多少个台阶,达达记录了迈多少个台阶能够到达下一个平台。
和很多大楼类似,每次爬楼梯到达一个平台,就需要转身再爬,到达两个平台代表上了一层楼。
请你计算一下,现在小可和达达已经到达了多少层!例如小可到了第八层,然后又向上爬了若干台阶,但是没有到第九层,那么输出第八层。


输入格式
第一行两个正整数 和 ,代表小可迈了 步, 个台阶能够上一楼。
第二行 个整数
,代表小可每一步迈出去的距离能够跨越多少个台阶。
 输出格式
如题,输出一个整数,代表现在小可和达达已经到达了多少层。

输入样例:
        10 10
         2 5 3 7 3 1 5 4 5 5
输出样例:
         3

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	//freopen("sline.in","r",stdin);
	//freopen("sline.out","w",stdout);
	int f[100005],n,x,o=0,k=0,p=0,t=0;//定义  
	cin>>n>>x;
	for(int i=1;i<=n;i++){
		cin>>f[i];//输入; 
		
	}
	for(int i=1;i<=n;i++){
		p=p+f[i];
		if(p>=x){
		    k++;
		    p=0;	
		}
		
	}
	cout<<k/2+1;//输出 
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}

    

思路:

       开一个大的二维数组,1层不用爬,要+1;平台数+1后清空计数器;一层要爬两段,所以要/2;(要爬两段那里真的很难理解,理解不了全废)

第二题:

                                    字符折线图


                                                       (sline.cpp/c)

问题描述
字符串也是有起伏的!我们根据一个字符串,可以画出一个折线图。从第二个字符开始,如果它比它的上一个字符大,那么就是上升的,画一个 / ;如果和上一个字符相同,那么画一个 - ;如果比比上一个字符小,那么就是下降的,画一个 \ 。并且上升的时候,要向上一行,下降的时候向下一行。具体例子如下:   

  
字符串 hkrzyqqqmi :
        /\
      /    \
    /        --
               \
                 \
注意控制格式,空白处使用空格填充,不要输出多余的空格。


输入格式
一个字符串,长度不超过 ,只包含小写字母。


输出格式
如题,根据输入的字符串画出折线图。


输入样例1
zyxvu


输出样例1
\
  \
    \
      \

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main(){
	//freopen("sline.in","r",stdin);
	//freopen("sline.out","w",stdout);
	int t,n,o=-1,h=100,maxx=0,minn=200,l;
	char f[205][205];
	string s;
	cin>>s;
	int len=s.size();
	for(int i=1;i<=200;i++){
		for(int j=1;j<=200;j++){
			f[i][j]=' ';
		}
	}
	for(int i=1;i<len;i++){
			if(s[i-1]<s[i]){
			    if(f[h][i-1]=='/'){
				    h--;
			    }
			    else if(f[h][i-1]=='-'){
				    h--;
			    } 
			    f[h][i]='/';
		    }
		    else if(s[i-1]==s[i]){
			    if(f[h][i-1]=='/'){
				    h--;
			    }
			    else if(f[h][i-1]=='\\'){
				    h++;
			    } 
			    f[h][i]='-';
		    }
		    else if(s[i-1]>s[i]){
			    if(f[h][i-1]=='-'){
				    h++;
			    }
			    else if(f[h][i-1]=='\\'){
				    h++;
			    } 
			    f[h][i]='\\';
		    }
		maxx=max(maxx,h);
		minn=min(minn,h);
	}
	for(int i=minn;i<=maxx;i++){
		for(int j=len-1;j>=1;j--){
			if(f[i][j]!=' '){
				l=j;
				break;
			}
		}
		for(int j=1;j<=l;j++){
			cout<<f[i][j];
		}
		cout<<endl;
	}
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}

思路:

       开个二维数组,输入空格;循环判断字符串前一个数是否>=<这个字符;并执行相应的操作;

最后倒着循环输出;(看了一圈应该只有二维数组能做,代码真的好长啊);

第三题:

                                             吉利数

                                                     (lucknum.cpp/c)


 

问题描述:
小可认为一个数字中如果有 这个数字就是不吉利的。相对的,其他的数字就是吉利的。吉利的数字有 1,2,3,5,6,7,8,9,10,..
小可想知道,第 个吉利的数字是多少。


 

输入格式:
第一行一个正整数 ,代表有 组输入。
接下来 行,每行一个正整数 ,代表小可想知道第 个吉利的数字是多少。


输出格式
对于每组输入,输出一行,代表相应的答案。
3.4 输入样例
5
1
2
14
255
12345678999999


输出样例
1
2
16
313
58737318092550
 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
    ll t,k;
    int a[30],cnt;
    int main(){
        scanf("%lld",&t);
        while(t--){
            scanf("%lld",&k);
            cnt=0;
            while(k){
                a[cnt++]=k%9;
                k/=9;
            }
            for(int i=cnt-1;i>=0;i--){
                if(a[i]>=4) 
		        printf("%d",a[i]+1);
                else printf("%d",a[i]);
            }
            printf("\n");
    }
    return 0;
}

思路:

         将十进制转换为九进制,后把四去除45678各加1得56789;这样就是123 56789(没有4),

输出(一开始真的想不到和九进制有什么关系,现在真的感觉好了很多(不要暴力,题目说了“直接进行暴力枚举即可。从 开始枚举,碰到吉利数,计数器加一。当计数器等于 时,输出结果。时间复杂度O(Tn)”))

第四题:

                                         路灯照明


                                                           (lighting.cpp/c)


问题描述
小可是一个相信光的人,他最近在研究光与距离的问题。
给定一个 的网格,每个网格都有一盏路灯,且都在格点上,即:四盏路灯的位置分别是左上角,右上角,左下角,右下角。
路灯都是需要耗电的,且耗电量与亮度有关,如果一盏路灯的耗电量是 ,则它可以为他所在的格子提供 的亮度,并且为他相邻的格子提供 ,为他对角的格子提供 的亮度,其中 表示对 向下取整。
某一个格子的亮度为四盏路灯为他提供的亮度之和,例如 左上角的灯耗电量为 4, 右上角的灯耗电量为 7,右下角的灯耗电量为 8,左下角的灯耗电量为 0,那么 左上角这个格子的亮度就是

现在我们对四个格子的最低亮度提出了要求,我们想要让四个格子的亮度都达到标准。你可以将每一盏灯的耗电量调节为任何一个大于等于零的整数,为了省电, 你希望四盏灯的耗电量之和尽可能的小,请问四盏灯的最小耗电量之和是多小?


输入格式
输入四个整数: ,分别表示左上、右上、左下、右下 四个格子要求的亮度之和。


输出格式
输出一行一个整数表示四盏灯的最小耗电量之和。


输入样例1
50 24 25 12


输出样例1
50

#include<iostream>
#include<cstdio>
using namespace std;
int a,b,c,d;
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);//b还需要多少亮度 
			int cneed=max(0,c-i/2-j/2);//c还需要多少亮度 
			int bb=max(0,(4*bneed-now)/3);//估算b耗电量大该区间 
			for(int k=max(0,bb-5);k<=min(now,bb+5);k++)
			if(k+(now-k)/4>=bneed&&k/4+now-k>=cneed)
			//左下提供+b>=b需要       左下>=c需要 
			return true;
		}
	}
	return 0;
}
int main(){
	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;
}

枚举左/右上耗电量,看b,c需要多少 亮度;估算b大概区间(这题真的好难啊啊啊啊啊啊啊啊啊啊啊啊 人傻啦呜呜呜呜呜呜呜呜呜呜呜我进力了啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值