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

时间:2023年10月1日

S****6     

一.题目报告

总分数:100

T1【爬楼梯.stair】:100

T2【字符折线图.sline】:0

T3【吉利数.lucknum】:0

T4【路灯照明.lighting】:0 

二.题目总结

1.本人有点菜在里面的,第一题改了好几遍,勉强正确~

但是!!最后考题的时候考成了原来的答案!在经过跟老师和谐的沟通后,总算是把分数要回来了

大家不要学我,保存题目的时候要认真仔细哦!

2.这道题一眼看上去就是很难的题,我修修改改了几遍还是一个示例也不对@·@,

所以直接提交了,当然也一分没得。

3.我在思考的时候遗落了一个条件,它对我来说也有难度,(虽然我一直想不明白为什么一分没得)在思考无果后选择放弃。

4.我本来想拿输入输出的分,(题目超级变态!!)但是没拿到·,因为太难还不会。

  三.题目详解
T1【爬楼梯】

题目描述:

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

思路:

【注意】1.爬一层楼需要爬两个平台,一次最多迈一个平台

               2.第一层不用爬

AC代码:
 

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	int n,x,a[100005],sum=0,cnt=0;
	cin>>n>>x;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
			sum=sum+a[i];
		if(sum>=x){
			cnt++;
			sum=0;
		}
	}

	cout<<cnt/2+1;
	return 0;
}
T2【字符折线图】

题目描述:

我们根据一个字符串,可以画出一个折线图。从第二个字符开始,如果它比它的上一个字符大,那么就是上升的,画一个/;如果和上一个字符相同,那么画一个-;如果比比上一个字符小,那么就是下降的,画一个\。并且上升的时候,要向上一行,下降的时候向下一行。

思路:

因为行数会不停变动,cin,cout解决不了换行的需求,所以我们可以创建一个二维数组,以二维数组的中心线做标,用下标去改变行数。输出时删掉空格就可以啦(具体看下图)

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	cin>>s;
	int len=s.size();
	char a[205][205];
	memset(a,' ',sizeof(a));
	int h=100,l=1,maxx=-1,minn=500;
	for(int i=1;i<len;i++){
		if(s[i]>s[i-1]){
			if(a[h][i-1]=='/'||a[h][i-1]=='-'){
		        --h;
			}
			a[h][l]='/';
		}
		else if(s[i]==s[i-1]){
			if(a[h][i-1]=='/'){
				a[--h][l]='-';
			}
			else{
				a[++h][l]='-';
			}
		}
		else if(s[i]<s[i-1]){ 
			if(a[h][i-1]=='\\'||a[h][i-1]=='-'){
				++h;
			}
			a[h][l]='\\';
		}
		maxx=max(maxx,h);
		minn=min(minn,h);
	}
	for(int i=minn;i<=maxx;i++){
		int in=0;
		for(int j=len-1;j>=1;j--){
			if(a[i][j]!=' '){
				in=j;
				break;
			}
		}
		for(int j=1;j<=in;j++){
			cout<<a[i][j];
		}
		cout<<'\n';
	}
	return 0;
}
T3【吉利数】

题目描述:

小可认为一个数字中如果有44这个数字就是不吉利的。相对的,其他的数字就是吉利的。吉利的数字有1,2,3,5,6,7,8,9,10,..

小可想知道,第n个吉利的数字是多少。

思路:已知一个数各个数位只局限于1-9,而吉利数恰巧不需要4,我们可以把10进制的数转成9进制的数,(9进制的数换算时没有4)再进行计数就可以了。

AC代码:

#include<iostream>
using namespace std;
long long a[105],cnt=0;
void c(long long n){
	while(n!=0){
		a[cnt]=n%9;
		cnt++;
		n=n/9;
	}
}
int main(){
	long long t,n;
	scanf("%lld",&t);
	for(int i=1;i<=t;i++){
		cnt=0;
		scanf("%lld",&n);
		c(n);
		for(int j=cnt-1;j>=0;j--){
			if(a[j]>=4){
				a[j]++;
 			} 
			printf("%lld",a[j]);
		}
		printf("\n");
	}

	return 0;
}
T4【路灯照明】

题目描述:

给定一个 2∗22∗2 的网格,每个网格都有一盏路灯,且都在格点上,即:四盏路灯的位置分别是左上角, 右上角,左下角,右下角。

路灯都是需要耗电的,且耗电量与亮度有关,如果一盏路灯的耗电量是 x ,则它可以为他所在的格子提供 x 的亮度,并且为他相邻的格子提供 ⌊2⌋⌊​2​​x​​⌋,为他对角的格子提供 ⌊4⌋⌊​4​​x​​⌋的亮度,其中 ⌊⌋⌊x⌋表示对 x 向下取整。

某一个格子的亮度为四盏路灯为他提供的亮度之和,例如 左上角的灯耗电量为 4, 右上角的灯耗电量为 7,右下角的灯耗电量为 8,左下角的灯耗电量为 0,那么 左上角这个格子的亮度就是 4+⌊72⌋+⌊74⌋+04+⌊​2​​7​​⌋+⌊​4​​7​​⌋+0 。

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

思路:

AC代码  :                                                                                                                                         

#include<iostream>
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);//a,d还需要多少亮度 
			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);//估算d耗电量大概区间 
			//p+q/4=bneed, p+q=now
			//p+q/4=bneed -> 得4p+q=4bneed
			//4p+q=4bneed -> 3p+now=4bneed
			//p(4bneed-now)/2
			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;
					//左下提供+b>=b需要    左下>=c需要 
				}
			}
			
		}
	}
	return false; 
}
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;
}

四.题目反思                                                                                                                                          在这场考试里,我不够细心,错把答案保存到了D盘里。还有一些题我不是很明白,也没有非常的认真。下次考试我会再接再厉,争取多对几道题。向更高的舞台前进。(第一次复赛模拟没有报0我还是很开心)                                                                               coduck出品,必属精品@~@                                                                                                                              

                                                        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值