博主:命运之光
专栏:算法修炼之练气篇
题目 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来累加,最后直接两个一减一输出就行了,下来让我们敲敲看有没有什么什么别的问题。
代码
inta[10005];//L长度<=10000intmain() { intcount=0;//这个来计算地铁长度inti;//下面要用intL,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--)//有多少个区域执行几次 { intleft,right;//声明区域左值和右值scanf("%d %d",&left,&right); for(i=left;i<=right;i++) { //看好了,下来是重点喽,直接解决这个问题if(a[i]==0) { a[i]=1; count++;//马路长度递加了哦!很容易吧! } } } printf("%d",L-count);//马路长度-地铁长度=剩下的树的数量return0; }
调试结果
正确答案
298
我的答案
297
我想的解决方法很简单,就是直接加1就行
printf("%d",L-count+1);//马路长度-地铁长度=剩下的树的数量
修改后代码
inta[10005];//L长度<=10000intmain() { intcount=0;//这个来计算地铁长度inti;//下面要用intL,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--)//有多少个区域执行几次 { intleft,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);//马路长度-地铁长度=剩下的树的数量return0; }
结果正确
题目 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
usingnamespacestd; intmain() { chars2[1000]; strings1; intn; cin>>n; getchar();//吃一个回车符号,因为下面用了一个gets()因为gets()会把回车符也认为是输入 while(n--) { gets(s2); cout<<s2<<endl; cout<<endl; } while(cin>>s1) { cout<<s1<<endl; cout<<endl; } return0; }
题目 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
intmain() { intn; while(scanf("%d",&n)!=EOF) { if(n==0) { return0; } printf("%d\n",n/2); } return0; }
题目 1145: C语言训练-自由落体问题
题目描述
一个球从100m高度自由落下,每次落地后反跳回原来高度的一半,再落下,再反弹.求它在第N次落地时共经过多少米?
输入格式
反弹的次数N
输出格式
小球经过的路程(保留四位小数)
样例输入
2
样例输出
200.0000
有特例先解决特例,其余按照找到的规律来
intmain() { intn;//触地次数doubleh=100;//记得用double型,否则答案错误33doublesum=100; inti; scanf("%d",&n); if(n==1)//先解决特例,这样下面就简单了 { printf("100.0000"); return0; } for(i=2;i<=n;i++) { h=h/2; sum=sum+2*h; } printf("%.4lf",sum); return0; }
题目 1143: C语言训练-素数问题
题目描述
编写一个程序判断一个数是否为素数
输入格式
整数
输出格式
1或0(其中1表示此数为素数,0为表示为不是素数)
样例输入
5
样例输出
1
素数在算法中可以算是一个十分特别的存在了,我们时不时就遇见一个和素数有关的问题,所以常备几种快速解决素数的算法就变得十分的重要。
usingnamespacestd; intmain() { intn; cin>>n; intflag=0; for(inti=2;i*i<=n;i++)//记得是<=否则会答案错误80,加一个等号就对了 { if(n%i==0) { flag=1; } } if(flag!=0) { cout<<"0"; } else { cout<<"1"; } return0; }