一:
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大概区间(这题真的好难啊啊啊啊啊啊啊啊啊啊啊啊 人傻啦呜呜呜呜呜呜呜呜呜呜呜我进力了啊)