时间: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⌋⌊2x⌋,为他对角的格子提供 ⌊4⌋⌊4x⌋的亮度,其中 ⌊⌋⌊x⌋表示对 x 向下取整。
某一个格子的亮度为四盏路灯为他提供的亮度之和,例如 左上角的灯耗电量为 4, 右上角的灯耗电量为 7,右下角的灯耗电量为 8,左下角的灯耗电量为 0,那么 左上角这个格子的亮度就是 4+⌊72⌋+⌊74⌋+04+⌊27⌋+⌊47⌋+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;
}