c语言程序设计植树,C语言程序设计100例之(19):欢乐的跳

例19   欢乐的跳

题目描述

一个n个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了[1,n-1]之间的所有整数,则称之符合“欢乐的跳”,如数组1 4 2 3符合“欢乐的跳”,因为差的绝对值分别为:3,2,1。

给定一个数组,你的任务是判断该数组是否符合“欢乐的跳”。

输入格式

每组测试数据第一行以一个整数n(1≤n≤1000)开始,接下来n个空格隔开的整数。

输出格式

对于每组测试数据,输出一行若该数组符合“欢乐的跳”则输出"Jolly",否则输出"Not jolly"。

输入样例 #1

4 1 4 2 3

输出样例 #1

Jolly

输入样例 #2

5 1 4 2 -1 6

输出样例 #2

Not jolly

(1)编程思路。

为了判断数组两个连续元素之间差的绝对值是否包括了[1,n-1]之间的所有整数,定义一个数组int hash[1001],其中hash[i]=0表示整数i未出现,hash[i]=1表示整数i出现过。初始时,hash数组的全部元素值均为0。

对n个元素的数组a,用循环for (i=1;i

之后,判断数组hash的情况,若数组元素hash[1]~hash[n-1]的值全为1,则表示数组a中两个连续元素之间差的绝对值包括了[1,n-1]之间的所有整数。

(2)源程序。

#include

#include

int main()

{

int hash[1001]={0},a[1001],n,i,d;

scanf("%d",&n);

for (i=0;i

scanf("%d",&a[i]);

for (i=1;i

{

d=abs(a[i]-a[i-1]);

if (d<=n-1) hash[d]=1;

}

for (i=1;i<=n-1;i++)

if (hash[i]==0) break;

if (i

printf("Not jolly

");

else

printf("Jolly

");

return 0;

}

习题19

19-1  校门外的树

本题选自洛谷题库 (https://www.luogu.org/problem/P1047)

题目描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,…,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有2个整数L((1≤L≤10000)和 M(1≤M≤100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。

接下来的M行每行包含2个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出格式

1个整数,表示马路上剩余的树的数目。

输入样例

500 3

150 300

100 200

470 471

输出样例

298

(1)编程思路。

定义数组int f[10001],其中f[i]=1表示坐标为i的位置有一棵树,f[i]=0表示坐标为i的位置的树被移走了。初始时,数组的元素f[0]~f[l]全部置为1,表示长度为L的马路上每间隔1米有一棵树。

每输入一组区域的起始点和终止点的坐标begin和end,就将f[begin]~f[end]之间的数组元素的值修改为0,表示树被移走了。

最后,统计数组f中值为1的元素的个数,就是马路上剩余的树的数目。

(2)源程序。

#include

int main()

{

int l,m,begin,end,i,cnt;

int f[10001];

scanf("%d%d",&l,&m);

for (i=0;i<=l;i++)

f[i]=1;

while (m--)

{

scanf("%d%d",&begin,&end);

for (i=begin;i<=end;i++)

f[i]=0;

}

cnt=0;

for (i=0;i<=l;i++)

{

if (f[i]==1)

cnt++;

}

printf("%d

",cnt);

return 0;

}

19-2  校门外的树(增强版)

本题选自洛谷题库 (https://www.luogu.org/problem/P1276)

题目描述

校门外马路上本来从编号0到L,每一编号的位置都有1棵树。有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B);幸运的是还有植树者每次从编号C到D 中凡是空穴(树被砍且还没种上树苗或树苗又被砍掉)的地方都补种上树苗(记 1 C D,含C和D);问最终校门外留下的树苗多少棵?植树者种上又被砍掉的树苗有多少棵?

输入格式

第一行L和N,表示校园外原来有L+1棵树,并有N次砍树或种树的操作。

以下N行,砍树或植树的标记和范围,每行3个整数。

L(1 <= L <= 10000)和 N(1 <= N <= 100)

输出格式

共两行。第1行校门外留下的树苗数目,第2行种上又被拔掉的树苗数目。

输入样例

10 3

0 2 6

1 1 8

0 5 7

输出样例

3

2

(1)编程思路。

本题思路与上题类同。同样定义数组int f[10001],其中f[i]=1表示坐标为i的位置有一棵树,f[i]=2表示坐标为i的位置补种了一颗树苗,f[i]=0表示坐标为i的位置的树或树苗被移走了。初始时,数组的元素f[0]~f[l]全部置为1,表示长度为L的马路上每间隔1米有一棵树。

程序中根据砍树或种树的操作对数组f的相应元素进行处理。具体见源程序。

(2)源程序。

#include

int main()

{

int l,n,m,begin,end,i,cnt1,cnt2;

int f[10001];

scanf("%d%d",&l,&n);

for (i=0;i<=l;i++)

f[i]=1;       // 初始为一棵树

cnt2=0;          // 种上又被砍掉的树苗数

while (n--)

{

scanf("%d%d%d",&m,&begin,&end);

if (m==0)    // 砍树或树苗

{

for (i=begin;i<=end;i++)

{

if (f[i]==2)  cnt2++;   // 树苗被砍掉了

f[i]=0;

}

}

else        // 种树苗

{

for (i=begin;i<=end;i++)

if (f[i]==0)

f[i]=2;

}

}

cnt1=0;         // 留下的树苗数

for (i=0;i<=l;i++)

{

if (f[i]==2)

cnt1++;

}

printf("%d

%d

",cnt1,cnt2);

return 0;

}

19-3  珠心算测验

题目描述

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

输入格式

共两行,第一行包含一个整数n,表示测试题中给出的正整数个数。

第二行有n个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

输出格式

一个整数,表示测验题答案。

输入样例

4

1 2 3 4

输出样例

2

说明/提示

【样例说明】

由1+2=3,1+3=4,故满足测试要求的答案为2。

注意,加数和被加数必须是集合中的两个不同的数。

(1)编程思路。

为了判断集合中有多少个数恰好等于集合中另外两个(不同的)数之和,定义一个数组int hash[10001],其中hash[i]=0表示整数i作为和值未出现,hash[i]=1表示整数i作为和值第1次出现了,hash[i]=2表示整数i作为和值不止1次出现了,只能算一次。初始时,hash数组中,属于集合元素的hash数组相应元素值置1,其余非集合元素的相应hash元素值均为0。

用二重循环

for (i=0;i

for (j=i+1;j

对集合中任意两个不同元素的和值t(t=num[i]+num[j])进行处理。若和值t的对应的hash[t]等于1,表示集合中存在元素t为另外两个不同元素的和,计数,同时置hash[t]=2,以避免下次再出现和值t产生重复计数。

(2)源程序。

#include

int main()

{

int n,i,j,t,cnt=0,num[100];

int hash[10001]={0};

scanf("%d",&n);

for (i=0;i

{

scanf("%d",&num[i]);

hash[num[i]]=1;

}

for (i=0;i

for (j=i+1;j

{

t=num[i]+num[j];

if (t<=10000 && hash[t]==1)

{

cnt++;

hash[t]=2;  // 注意:1+4和2+3也算重复,需去掉

}

}

printf("%d

",cnt);

return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机C语言程序设计实训100例:基于AVR Proteus仿真 PDF 是一本针对单片机C语言程序设计的实训教材。该教材以AVR单片机为基础,结合Proteus仿真软件,提供了100个实例供学习者练习和巩固所学的单片机C语言编程知识。 这本教材的特点如下: 1. 针对实际应用场景:教材中的实例均基于实际应用场景设计,涵盖了单片机各个方面的知识和应用,包括IO口操作、定时器、串口通信、LCD显示等。通过这些实例,学习者可以更好地了解单片机的应用领域和常见应用技巧。 2. 详细的编程步骤:每个实例都有详细的编程步骤和思路说明,学习者可以按照教材提供的指导逐步完成实验。同时,教材还提供了相应的代码和仿真电路图,学习者可以在Proteus中进行仿真调试,观察程序的运行情况和相应的电路变化。 3. 巩固知识点:教材设计了一些较为复杂的实例,通过这些实例,学习者可以巩固已学的知识,并进一步提升自己的编程能力和解决问题的能力。 4. 实践与理论相结合:教材在介绍实验内容的同时,还提供了相关的理论知识,帮助学习者理解实验的原理和背后的知识点。这样学习者不仅可以掌握实验的具体操作步骤,更能够理解其背后的原理和机制。 通过学习这本教材,学习者可以系统地学习和掌握单片机C语言编程,提高自己的实际操作能力。同时,通过Proteus仿真软件的使用,学习者能够在电脑上进行实验,不受硬件设备的限制,更加方便灵活。 总之,单片机C语言程序设计实训100例:基于AVR Proteus仿真 PDF是一本很好的教材,对于学习者来说是一份宝贵的学习资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值