博主:命运之光
专栏:算法修炼之练气篇
前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的,练完这200多道题就考了今年第十四届的B组蓝桥杯C/C++获得了省一,后面还会更新“算法修炼之筑基篇”里面包括了省赛到国赛这一个月训练的刷奖计划,大概有40道左右,感兴趣的话可以关注一下命运之光)
目录
题目 1099: 校门外的树
题目描述
输入格式
输出格式
样例输入
样例输出
题目 1094: 字符串的输入输出处理
题目描述
输入格式
输出格式
样例输入
样例输出
题目 1072: 汽水瓶
题目描述
输入格式
输出格式
样例输入
样例输出
题目 1145: C语言训练-自由落体问题
题目描述
输入格式
输出格式
样例输入
样例输出
题目 1143: C语言训练-素数问题
题目描述
输入格式
输出格式
样例输入
样例输出
🍓🍓今日份修炼结束,再接再厉!!!
题目 1099: 校门外的树
题目描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入格式
输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出格式
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入
500 3 150 300 100 200 470 471
样例输出
298
我们先分析一下题目
具体我想的思路就是:
定义一个数组让它为马路长度,全部为0,如果里面有地铁就定义为1,用count来累加,最后直接两个一减一输出就行了,下来让我们敲敲看有没有什么什么别的问题。
代码
#include<stdio.h>
int a[10005];//L长度<=10000
int main()
{
int count=0;//这个来计算地铁长度
int i;//下面要用
int L,M;
scanf("%d %d",&L,&M);
for(i=1;i<=L;i++)//1<=L<=10000题目中马路范围
{//我感觉从1开始更好理解就将i从1开始了
a[i]=0;//将马路L赋值为0
}
while(M--)//有多少个区域执行几次
{
int left,right;//声明区域左值和右值
scanf("%d %d",&left,&right);
for(i=left;i<=right;i++)
{
//看好了,下来是重点喽,直接解决这个问题
if(a[i]==0)
{
a[i]=1;
count++;//马路长度递加了哦!很容易吧!
}
}
}
printf("%d",L-count);//马路长度-地铁长度=剩下的树的数量
return 0;
}
调试结果
正确答案
298
我的答案
297
我想的解决方法很简单,就是直接加1就行
printf("%d",L-count+1);//马路长度-地铁长度=剩下的树的数量
修改后代码
#include<stdio.h>
int a[10005];//L长度<=10000
int main()
{
int count=0;//这个来计算地铁长度
int i;//下面要用
int L,M;
scanf("%d %d",&L,&M);
for(i=1;i<=L;i++)//1<=L<=10000题目中马路范围
{//我感觉从1开始更好理解就将i从1开始了
a[i]=0;//将马路L赋值为0
}
while(M--)//有多少个区域执行几次
{
int left,right;//声明区域左值和右值
scanf("%d %d",&left,&right);
for(i=left;i<=right;i++)
{
//看好了,下来是重点喽,直接解决这个问题
if(a[i]==0)
{
a[i]=1;
count++;//马路长度递加了哦!很容易吧!
}
}
}
printf("%d",L-count+1);//马路长度-地铁长度=剩下的树的数量
return 0;
}
结果正确
题目 1094: 字符串的输入输出处理
题目描述
字符串的输入输出处理。
输入格式
第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。
输出格式
先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。每行输出之间输出一个空行。
样例输入
2 www.dotcpp.com DOTCPP A C M D O T CPP
样例输出
www.dotcpp.com DOTCPP
A C M
D
O
T
CPP
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s2[1000];
string s1;
int n;
cin>>n;
getchar();//吃一个回车符号,因为下面用了一个gets()因为gets()会把回车符也认为是输入
while(n--)
{
gets(s2);
cout<<s2<<endl;
cout<<endl;
}
while(cin>>s1)
{
cout<<s1<<endl;
cout<<endl;
}
return 0;
}
题目 1072: 汽水瓶
题目描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
输入格式
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出格式
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
样例输入
3
10
81
0
样例输出
1
5
40
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
return 0;
}
printf("%d\n",n/2);
}
return 0;
}
题目 1145: C语言训练-自由落体问题
题目描述
一个球从100m高度自由落下,每次落地后反跳回原来高度的一半,再落下,再反弹.求它在第N次落地时共经过多少米?
输入格式
反弹的次数N
输出格式
小球经过的路程(保留四位小数)
样例输入
2
样例输出
200.0000
有特例先解决特例,其余按照找到的规律来
#include<stdio.h>
int main()
{
int n;//触地次数
double h=100;//记得用double型,否则答案错误33
double sum=100;
int i;
scanf("%d",&n);
if(n==1)//先解决特例,这样下面就简单了
{
printf("100.0000");
return 0;
}
for(i=2;i<=n;i++)
{
h=h/2;
sum=sum+2*h;
}
printf("%.4lf",sum);
return 0;
}
题目 1143: C语言训练-素数问题
题目描述
编写一个程序判断一个数是否为素数
输入格式
整数
输出格式
1或0(其中1表示此数为素数,0为表示为不是素数)
样例输入
5
样例输出
1
素数在算法中可以算是一个十分特别的存在了,我们时不时就遇见一个和素数有关的问题,所以常备几种快速解决素数的算法就变得十分的重要。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int flag=0;
for(int i=2;i*i<=n;i++)//记得是<=否则会答案错误80,加一个等号就对了
{
if(n%i==0)
{
flag=1;
}
}
if(flag!=0)
{
cout<<"0";
}
else
{
cout<<"1";
}
return 0;
}